Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/102.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在Swift中子类化NSObject-使用初始值设定项的最佳实践_Ios_Swift_Initialization_Subclass_Nsobject - Fatal编程技术网

Ios 在Swift中子类化NSObject-使用初始值设定项的最佳实践

Ios 在Swift中子类化NSObject-使用初始值设定项的最佳实践,ios,swift,initialization,subclass,nsobject,Ios,Swift,Initialization,Subclass,Nsobject,这是一个示例类的布局,有人可以指导我在创建NSObject子类时的最佳实践吗 class MyClass: NSObject { var someProperty: NSString! = nil override init() { self.someProperty = "John" super.init() } init(fromString string: NSString) { self.somePro

这是一个示例类的布局,有人可以指导我在创建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()

当子类化
NSObject
时,在Swift中设置初始值设定项的正确方法是什么我该怎么称呼超级init呢


这个问题(尽管是在目标C中)建议您应该有一个init,您总是调用它,并简单地在更具体的init中设置属性:

我不是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() // can actually be omitted in this example because will happen automatically.
    }
    
    convenience override init() {
        self.init(fromString:"John") // calls above mentioned controller with default name
    }        
}


请参见

如果someProperty可以为nil,那么我认为您希望将该属性定义为:

var someProperty: NSString?

这还消除了对自定义初始值设定项的需要(至少对于该属性是这样),因为该属性在初始化时不需要值。

作为答案的补充,最好在其他语句之前调用super.init()。我认为这在Swift中是一个更高的要求,因为分配是隐式的。

Swift编程语言有一个覆盖继承、指定与方便初始化等的定义。这个过程与Objective-C有很大的不同(对我来说感觉更复杂/微妙),所以一定要阅读它来更好地理解该做什么。如果你想初始化多个属性呢?一个是字符串,另一个是NSNumber、数组等…@Supertecnoboff您可以将它们分别添加到初始化器方法中,即:
init(名称:NSString,年龄:NSNumber,children:[NSString]){self.name=name-self.age=age-self.children=children-super.init()}
在初始化声明中没有默认值的非可选字段之前,不能调用
super.init()
。在这种情况下,它可以工作,因为属性是可选类型:
NSString