Pembaruan: Dari Swift 2.2 Change Log (dirilis 21 Maret 2016):
Penginisialisasi kelas yang ditunjuk dideklarasikan sebagai gagal atau melempar sekarang dapat mengembalikan nihil atau memunculkan kesalahan, masing-masing, sebelum objek diinisialisasi sepenuhnya.
Untuk Swift 2.1 dan sebelumnya:
Menurut dokumentasi Apple (dan kesalahan kompiler Anda), kelas harus menginisialisasi semua properti yang disimpannya sebelum kembali nil
dari penginisialisasi yang gagal:
Untuk kelas, bagaimanapun, penginisialisasi yang gagal dapat memicu kegagalan inisialisasi hanya setelah semua properti tersimpan yang diperkenalkan oleh kelas tersebut telah disetel ke nilai awal dan setiap pendelegasian penginisialisasi telah dilakukan.
Catatan: Ini sebenarnya berfungsi dengan baik untuk struktur dan enumerasi, hanya saja tidak untuk kelas.
Cara yang disarankan untuk menangani properti tersimpan yang tidak dapat diinisialisasi sebelum penginisialisasi gagal adalah dengan mendeklarasikannya sebagai opsional yang tidak terbungkus secara implisit.
Contoh dari dokumen:
class Product {
let name: String!
init?(name: String) {
if name.isEmpty { return nil }
self.name = name
}
}
Dalam contoh di atas, properti name dari kelas Produk didefinisikan sebagai memiliki tipe string opsional yang tidak terbungkus secara implisit (String!). Karena ini adalah tipe opsional, ini berarti bahwa properti name memiliki nilai default nil sebelum diberi nilai tertentu selama inisialisasi. Nilai default nil ini pada gilirannya berarti bahwa semua properti yang diperkenalkan oleh kelas Produk memiliki nilai awal yang valid. Akibatnya, penginisialisasi yang dapat gagal untuk Produk dapat memicu kegagalan inisialisasi di awal penginisialisasi jika diberikan string kosong, sebelum menetapkan nilai tertentu ke properti nama dalam penginisialisasi.
Dalam kasus Anda, bagaimanapun, hanya dengan mendefinisikan userName
sebagai String!
tidak memperbaiki kesalahan kompilasi karena Anda masih perlu khawatir tentang menginisialisasi properti pada kelas dasar Anda NSObject
,. Untungnya, dengan userName
didefinisikan sebagai String!
, Anda sebenarnya dapat memanggil super.init()
sebelum Anda return nil
yang akan menginisialisasi NSObject
kelas dasar Anda dan memperbaiki kesalahan kompilasi.
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
parameter boolean yang memungkinkan inisialisasi saya menghitung properti yang dapat atau tidak dapat dibuat dengan cepat. Misalnya, jika adadateCreated
kunci yang hilang dan saya dapat menyetel properti dengan cepat karenacanSetCalculableProperties
parameternya benar, maka saya cukup menyetelnya ke tanggal saat ini.