发现swift和java有一个完全不一样的地方
在swift中,子类必须先初始化子类的所有属性,然后才能调用父类的构造器. 而在java中.super调用必须出现在构造函数的第一行.
java代码
public class Dog { String name; Dog(String name){ this.name = name; }}class NoisyDog extends Dog { int age; NoisyDog(String name) { // 交换以下两行的顺序会报错: Constructor call must be the first statement in a constructor super(name); this.age = 5; } }
对应的swift代码:
class Dog { var name: String; init(name: String){ self.name = name; }}class NoisyDog: Dog { var age: Int overrIDe init(name: String) { //交换以下两行的顺序会报错error: property 'self.age' not initialized at super.init call self.age = 5; super.init(name: name); } }
书中关于failable initializer描述有错误
以下代码在swift2.1及之前会编译错误,在swift2.2中修正了这个BUG
swift2.2: 子类failable designated 构造器在返回nil前不必初始化子类的属性也不必调用父类的designated initializer,也就是说,在子类的failable initilizer中允许提前返回nil
//: Playground - noun: a place where people can playimport Foundationclass Dog{ var name: String init(name: String){ self.name = name } }class NoisyDog : Dog { var age: Int overrIDe init(name: String){ self.age = 5 super.init(name: name) } init?(name: String,age: Int){ // as of swift2.2: 子类failable designated 构造器在返回nil前不必初始化子类的属性 // 也不必调用父类的designated initializer if age < 0 { return nil } self.age = age; super.init(name: name) } }
见: http://stackoverflow.com/questions/26495586/best-practice-to-implement-a-failable-initializer-in-swift/26497229#26497229
总结以上是内存溢出为你收集整理的Swift2.2 failable initializer允许提前返回nil以及和Java的不同全部内容,希望文章能够帮你解决Swift2.2 failable initializer允许提前返回nil以及和Java的不同所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)