NS_DESIGNATED_INITIALIZER
kullanımı güzel http://useyourloaf.com/blog/2014/08/19/xcode-6-objective-c-modernization.html açıklanmıştır:
The designated initializer guarantees the object is fully initialised by sending an initialization message to the superclass. The implementation detail becomes important to a user of the class when they subclass it. The rules for designated initializers in detail:
- A designated initializer must call (via super) a designated initializer of the superclass. Where NSObject is the superclass this is just [super init].
- Any convenience initializer must call another initializer in the class - which eventually leads to a designated initializer.
- A class with designated initializers must implement all of the designated initializers of the superclass.
Örnek olarak, arayüz
@interface MyClass : NSObject
@property(copy, nonatomic) NSString *name;
-(instancetype)initWithName:(NSString *)name NS_DESIGNATED_INITIALIZER;
-(instancetype)init;
@end
sonra derleyici olup olmadığını kontrol eder, eğer çağıran init
(kolaylık) başlatıcı (atanmış) başlatıcı initWithName:
, bu nedenle bir uyarı neden olur:
-(instancetype)init
{
self = [super init];
return self;
}
ve bu Tamam olurdu: yaklaşık
-(instancetype)init
{
self = [self initWithName:@""];
return self;
}
yılında Swift kurallar belirlenmiş ve belirlenen Amaç işaretleme, Objective-C ve Swift kodu karıştırın eğer kolaylık ilklendiriciler daha sıkı, ve -C başlatıcılar, derleyicinin kuralları zorlamasına yardımcı olur.
Örneğin, bu Swift alt bir derleyici hatası vardır:
class SwClass: MyClass {
var foo : String
init(foo : String) {
self.foo = foo
super.init()
}
}
ve bu Tamam olacaktır:
class SwClass: MyClass {
var foo : String
init(foo : String) {
self.foo = foo
super.init(name: "")
}
}
Objective-C'deki konsept ile çok iyi düşünülmüş çünkü initWithName: @ "" alt sınıflandırmada her zaman mantıklı değil. Bunun yerine, normal sınıf üst üste atanan atanmış üst sınıftan, alt sınıftan atanmış başlatıcıyı kullanmak için söyleyerek istisna atmalıdır. – Andy
Martin'in cevabına eklemek için, kullanıcının varsayılan başlatıcıları çağırmasını tamamen iptal etmek isteyebilirsiniz, bu durumda aşağıdakileri kullanabilirsiniz: - (instancetype) init NS_UNAVAILABLE; –