代码之家  ›  专栏  ›  技术社区  ›  kerry

Swift初始值设定项之谜

  •  3
  • kerry  · 技术社区  · 7 年前

    几段代码:

    这项工作:

    import Foundation
    
    class Class1 {
        init(param1: String?) {
            print("hello")
        }
    
        convenience init() {
            self.init(param1: nil)
        }
    }
    
    class SubClass1: Class1 {
    
    }
    
    let obj = SubClass1()
    

    在上面的代码中,指定的初始化器被传递给子类1,因为子类1不提供自己的指定初始化器。此外,还传递了方便初始化器。因此,这是可行的。

    import Foundation
    
    class Class1 {
        init(param1: String?) {
            print("hello")
        }
    
        convenience init() {
            self.init(param1: nil)
        }
    }
    
    class SubClass1: Class1 {
        override init(param1: String?) {
            print("hello 2")
            super.init(param1: nil)
        }
    }
    
    let obj = SubClass1()
    

    这也是可行的,因为子类1现在已经提供了自己的指定初始化器。

    import Foundation
    
    class Class1 {
        init(param1: String?) {
            print("hello")
        }
    
        init(param2: String?) {
            print("world")
        }
    
        convenience init() {
            self.init(param1: nil)
        }
    }
    
    class SubClass1: Class1 {
        override init(param1: String?) {
            print("hello 2")
            super.init(param1: nil)
        }
    }
    
    let obj = SubClass1()
    

    这为最后一行提供了“错误:调用中参数“param1”缺少参数”。 在这里,子类1有一个指定的初始化器,来自父类的方便初始化器也调用相同的初始化器,那么为什么会出现错误?

    import Foundation
    
    class Class1 {
        init(param1: String?) {
            print("hello")
        }
    
        required init(param2: String?) {
            print("world")
        }
    
        convenience init() {
            self.init(param1: nil)
        }
    }
    
    class SubClass1: Class1 {
        override init(param1: String?) {
            print("hello 2")
            super.init(param1: nil)
        }
    
        required init(param2: String?) {
            print("world")
            super.init(param2: nil)
        }
    }
    
    let obj = SubClass1()
    

    这是可行的:

    import Foundation
    
    class Class1 {
        init(param1: String?) {
            print("hello")
        }
    
        init(param2: String?) {
            print("world")
        }
    
        convenience init() {
            self.init(param1: nil)
        }
    }
    
    class SubClass1: Class1 {
        override init(param1: String?) {
            print("hello 2")
            super.init(param1: nil)
        }
    
        override init(param2: String?) {
            print("world")
            super.init(param2: nil)
        }
    }
    
    let obj = SubClass1()
    

    为什么需要覆盖所有指定的初始值设定项才能使仅调用其中一个指定初始值设定项的一个方便初始值设定项工作?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Sweeper    7 年前

    swift guide .

    在子类中引入以下两条规则:

    规则1 如果您的子类没有定义任何指定的初始值设定项,则 自动继承其所有超类指定的初始值设定项。

    规则2 如果您的子类提供了 its的 超类通过继承它们来指定初始值设定项 规则1,或者通过提供自定义实现作为其 定义然后它自动继承所有超类