Swift2.2 failable initializer允许提前返回nil以及和Java的不同

前端之家收集整理的这篇文章主要介绍了Swift2.2 failable initializer允许提前返回nil以及和Java的不同前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

发现swift和java有一个完全不一样的地方

在swift中,子类必须先初始化子类的所有属性,然后才能调用父类的构造器. 而在java中.super调用必须出现在构造函数的第一行.

java代码

  1. public class Dog {
  2. String name;
  3. Dog(String name){
  4. this.name = name;
  5. }
  6. }
  7.  
  8.  
  9. class NoisyDog extends Dog {
  10. int age;
  11. NoisyDog(String name) {
  12. // 交换以下两行的顺序会报错: Constructor call must be the first statement in a constructor
  13. super(name);
  14. this.age = 5;
  15. }
  16. }

对应的swift代码:

  1. class Dog {
  2. var name: String;
  3. init(name: String){
  4. self.name = name;
  5. }
  6. }
  7.  
  8.  
  9. class NoisyDog: Dog {
  10. var age: Int
  11. override init(name: String) {
  12. //交换以下两行的顺序会报错error: property 'self.age' not initialized at super.init call
  13. self.age = 5;
  14. super.init(name: name);
  15. }
  16. }

书中关于failable initializer描述有错误

以下代码在swift2.1及之前会编译错误,在swift2.2中修正了这个bug
swift2.2: 子类failable designated 构造器在返回nil前不必初始化子类的属性也不必调用父类的designated initializer,也就是说,在子类的failable initilizer中允许提前返回nil

  1. //: Playground - noun: a place where people can play
  2. import Foundation
  3.  
  4. class Dog{
  5. var name: String
  6. init(name: String){
  7. self.name = name
  8. }
  9. }
  10.  
  11. class NoisyDog : Dog {
  12. var age: Int
  13. override init(name: String){
  14. self.age = 5
  15. super.init(name: name)
  16. }
  17. init?(name: String,age: Int){
  18. // as of swift2.2: 子类failable designated 构造器在返回nil前不必初始化子类的属性
  19. // 也不必调用父类的designated initializer
  20. if age < 0 {
  21. return nil
  22. }
  23. self.age = age;
  24. super.init(name: name)
  25. }
  26. }

见: http://stackoverflow.com/questions/26495586/best-practice-to-implement-a-failable-initializer-in-swift/26497229#26497229

猜你在找的Swift相关文章