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

本文探讨了Swift和Java中构造器的实现差异,特别是在子类构造器中调用父类构造器的要求不同。Swift要求子类属性必须先初始化再调用父类构造器,而Java则要求super调用必须放在构造函数首行。

发现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 play
import Foundation

class 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

 

 

转载于:https://my.oschina.net/uniquejava/blog/683106

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值