Подкласс NSObject в Swift - лучшая практика с инициализаторами
Вот макет примерного класса, может ли кто-нибудь направить меня на какую лучшую практику при создании подкласса NSObject?
class MyClass: NSObject {
var someProperty: NSString! = nil
override init() {
self.someProperty = "John"
super.init()
}
init(fromString string: NSString) {
self.someProperty = string
super.init()
}
}
Является ли это правильным, могу ли я следовать лучшей практике здесь?
Интересно, правильно ли я устанавливаю инициализаторы (тот, который устанавливает строку по умолчанию, и тот, который я могу передать в строке)?
Должен ли я называть super.init()
в конце каждого из инициализаторов?
Если мой более определенный (тот, который берет строку) инициализатор просто вызывает self.init()
в конце, а не super.init()
?
Каков правильный способ установки инициализаторов в Swift при подкласце NSObject
? - и как я могу назвать супер init?
Этот вопрос (хотя и в Objective C) предполагает, что у вас должен быть init, который вы всегда вызываете, и просто задаете свойства в более конкретных inits: Objective-C Несколько инициализаторов
Ответы
Ответ 1
Я не Swift ninja, но я написал бы MyClass
как:
class MyClass: NSObject {
var someProperty: NSString // no need (!). It will be initialised from controller
init(fromString string: NSString) {
self.someProperty = string
super.init()
}
convenience override init() {
self.init(fromString:"John") // calls above mentioned controller with default name
}
}
См. раздел инициализации документации
Ответ 2
Если someProperty может быть nil, тогда я думаю, что вы хотите определить свойство как:
var someProperty: NSString?
Это также устраняет необходимость в пользовательском инициализаторе (по крайней мере, для этого свойства), так как свойство не требует значения во время инициализации.
Ответ 3
В дополнение к ответам, хорошей идеей является вызов super.init() перед другими утверждениями. Я думаю, что это более сильное требование в Swift, потому что распределения неявны.