Подтвердить что ты не робот

Подкласс 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 Несколько инициализаторов

4b9b3361

Ответ 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, потому что распределения неявны.