Swift中可能失败的构造器的传播(调用)和重写

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Swift中可能失败的构造器的传播(调用)和重写相关的知识,希望对你有一定的参考价值。

import Foundation

/*
可能失败构造器的传播(调用)
1.可能失败的构造器可以调用同一个类中的普通构造器
2.普通构造器不能调用同一个类中的可能失败构造器
3.结构体中, 普通构造器却可以调用同一个结构体中可能失败的构造器

可能失败构造器的重写
1.子类可以用可能失败的构造器或者普通的构造器重写父类中的可能失败的构造器
2.子类的普通构造器不能向上调用父类的可能失败的构造器
3.子类的可能失败的构造器可以调用父类的可能失败的构造器
*/

class Person {
    
    var name: String = ""
    
    // 定义指定构造器
    init(){
        
    }
    
    // 定义可能失败构造器
    init?(name: String) {
        if !name.isEmpty {
            self.name = name
        } else {
            print("构造失败")
            return nil
        }
    }
}

class Man: Person {
    
    var sex = "男"
    
    // 使用普通构造器重写父类的构造器
    override init(name: String) {
        // 由于该构造器是普通构造器, 因此不能调用父类的显式(?)可能失败的构造器
        // 可以调用父类的隐式(!)可能失败的构造器 或 调用父类中的普通构造器
        super.init()
    }

    // 定义可能失败构造器
    init!(name: String, sex: String) {
        // 子类中的可能失败构造器可以调用父类的可能失败构造器
        super.init(name: name)
        if sex == "其他" {
            print("构造失败")
            return nil
        }
        self.sex = sex
    }
}

let p1 = Man(name: "")
print(p1)
let p2 = Man(name: "rinpe", sex: "男")
print(p2 == nil)
let p3 = Man(name: "", sex: "女")
print(p3 == nil)

  

以上是关于Swift中可能失败的构造器的传播(调用)和重写的主要内容,如果未能解决你的问题,请参考以下文章

重写构造函数中调用的方法时,Groovy metaClass 失败?

Swift中构造器的继承和重写

学习Swift -- 构造器(下)

swift 元类构造方法

swift 元类构造方法

可失败构造器(Failable Initializers)