Ios 在Swift中子类化NSObject-使用初始值设定项的最佳实践
这是一个示例类的布局,有人可以指导我在创建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
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代码>。