Güncelleme: Gönderen Swift 2.2 Değişikliği Günlüğü'nde (2016 21 Mart yayınlandı):
Kullanılabilir veya fırlatma olarak bildirilen belirlenmiş sınıf başlatıcıları, nesne tam olarak başlatılmadan önce sırasıyla sıfır döndürebilir veya bir hata atabilir.
Swift 2.1 ve öncesi için:
Apple'ın belgelerine (ve sizin derleyici nil
hatanıza ) göre, bir sınıf, kullanılabilir bir başlatıcıdan dönmeden önce tüm depolanan özelliklerini başlatmalıdır:
Bununla birlikte, sınıflar için, kullanılabilir bir başlatıcı, ancak bu sınıf tarafından sunulan tüm depolanan özellikler bir başlangıç değerine ayarlandıktan ve herhangi bir başlatıcı yetkilendirmesi gerçekleştikten sonra bir başlatma hatasını tetikleyebilir.
Not: Aslında yapılar ve numaralandırmalar için iyi çalışır, sadece sınıflar için değil.
Başlatıcı başarısız olmadan önce başlatılamayan depolanan özellikleri işlemenin önerilen yolu, bunları örtük olarak sarmalanmamış isteğe bağlı öğeler olarak bildirmektir.
Dokümanlardan örnek:
class Product {
let name: String!
init?(name: String) {
if name.isEmpty { return nil }
self.name = name
}
}
Yukarıdaki örnekte, Product sınıfının name özelliği, dolaylı olarak sarmalanmamış isteğe bağlı bir dize türüne (Dize!) Sahip olarak tanımlanmıştır. İsteğe bağlı bir tür olduğundan, bu, name özelliğinin, başlatma sırasında belirli bir değer atanmadan önce varsayılan bir sıfır değerine sahip olduğu anlamına gelir. Bu varsayılan sıfır değeri, Product sınıfı tarafından tanıtılan tüm özelliklerin geçerli bir başlangıç değerine sahip olduğu anlamına gelir. Sonuç olarak, Ürün için kullanılabilir başlatıcı, başlatıcı içindeki name özelliğine belirli bir değer atamadan önce boş bir dize geçirilirse başlatıcının başlangıcında bir başlatma hatasını tetikleyebilir.
Bununla birlikte, sizin durumunuzda, basitçe userName
a olarak tanımlamak String!
derleme hatasını düzeltmez çünkü yine de temel sınıfınızdaki özellikleri başlatmak için endişelenmeniz gerekir NSObject
,. Neyse ki, a olarak userName
tanımlandığında String!
, aslında temel sınıfınızı başlatacak ve derleme hatasını düzelten super.init()
önünüzde arayabilirsin .return nil
NSObject
class User: NSObject {
let userName: String!
let isSuperUser: Bool = false
let someDetails: [String]?
init?(dictionary: NSDictionary) {
super.init()
if let value = dictionary["user_name"] as? String {
self.userName = value
}
else {
return nil
}
if let value: Bool = dictionary["super_user"] as? Bool {
self.isSuperUser = value
}
self.someDetails = dictionary["some_details"] as? Array
}
}
canSetCalculableProperties
başlatıcımın anında oluşturulabilen veya oluşturulamayan özellikleri hesaplamasına izin veren bir boole parametresi ekledim . Örneğin, eğer birdateCreated
anahtar eksikse ve özelliği anındacanSetCalculableProperties
parametre true olduğu için ayarlayabilirsem, o zaman sadece geçerli tarihe ayarlıyorum.