我有以下代码示例(来自PlayGround):
class Serializable : NSObject{ override init() { } } class Device : Serializable{ var uuid:String override init() { println("init ") self.uuid = "XXX" self.uuid = Device.createUUID() println(self.uuid) } class func createUUID() -> String{ return "XXX2" } } var device = Device()
您可以注意到我将createUUID方法实现为静态.
但是为什么我不能以静态的方式从init调用这个方法呢? :
class Serializable : NSObject{ override init() { } } class Device : Serializable{ var uuid:String override init() { // tried // super.init() println("init ") self.uuid = "XXX" self.uuid = self.createUUID() // ERROR self.uuid = createUUID() // ERROR println(self.uuid) // tried // super.init() } func createUUID() -> String{ return "XXX2" } } var device = Device()
没有继承它可以正常工作:
class Device { var uuid:String init() { println("init ") self.uuid = "XXX" self.uuid = self.createUUID() println(self.uuid) } func createUUID() -> String{ return "XXX2" } } var device = Device()
有两个竞争
initialization safety checks导致您的问题.
Safety check 1
A designated initializer must ensure that all of the properties introduced by its class are initialized before it delegates up to a superclass initializer.
和
Safety check 4
An initializer cannot call any instance methods,read the values of any instance properties,or refer to self as a value until after the first phase of initialization is complete.
下面是它的工作原理.
override init() { super.init() // Fails safety check 1: uuid is not initialized. uuid = createUUID() }
反过来,
override init() { uuid = createUUID() // Fails safety check 4: cannot call an instance method before initialization is complete. super.init() }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。