2016-11-23 32 views
0

当涉及到Swift类时,我需要初始化程序和委托初始化程序之间有点混淆。Swift - 必需的初始化程序与委托初始化程序之间的一点混淆

正如你可以在我的例子代码中看到的,NewDog可以用2种方式中的1种进行初始化。正如你所看到的,你可以通过初始化时提供初始化来初始化,在这种情况下,默认名称将被分配(“好友”)。

我不明白的是为什么NewDog类需要初始值设定项所需的关键字,如果初始化程序甚至没有被使用?请参阅.. var georgie正在使用常规初始化程序(不是NewDog中必需的初始化程序)并且它工作得很好。

那么它是什么需要,如果它是...其实..不是必需的? *如果我拿走那个初始化器,编译器就会大声说“必需”初始化器'init'必须由'Dog''的子类提供。

嗯好的......我把它放回去......但是我不必使用它,因为NewDog中的第一个初始化器实现了所有的成员属性初始化......我没有看到逻辑在这里。

class Dog { 
    var name : String 
    required init(_ name: String) { 
     self.name = name 
    } 
} 

class NewDog: Dog { 
    var age : Int? 
    init(age: Int, name: String) { 
     super.init(name) 
     self.age = age 
    } 

    required init(_ name: String) { 
     super.init(name) 
    } 
} 

var georgie = NewDog(age: 6, name: "Georgie") 
georgie.age 

那么有人可以向我解释什么是必需的关键字是什么?我的猜测是,它只是告诉编译器“嘿......冷静下来...... name属性将在我们的子类中初始化,因为你在大声喊我要求它...所以只需放松一下,我就会处理它在我自己的。我打算做一个明确的子类初始化,我创建自己“...

*****也!奖金问题:NewDog中的哪个初始化程序是指定初始化程序?

感谢

回答

1

一个required初始化意味着每个子类必须实现相同的初始化。由于您创建了Dog类中所需的init(_:)初始值设定项,因此Dog的每个子类(及其子类)也必须提供相同的required init(_:)初始值设定项。

从外观看,您不需要在Dog类中设置init(_:)初始值设定项。删除该关键字,然后您可以从NewDog类中删除init(_:)初始值设定项。

奖励 - 您的NewDog类中的init方法都是指定的初始值设定项,因为它们都不是方便初始值设定项。

您需要了解默认值,便利性和所需初始值设定项的区别和用法。这全部在The Swift Programming Language书的Intializers部分清楚地涵盖。

+0

我只是在指定和要求之间的差异而感到困惑。不过谢谢。此外,Dog类中所需的init是用于多元语用的目的。制作了一个采用Dog类型并初始化并返回新实例的工厂。由于它采用了Dog类型,因此需要让编译器知道我可能正在传递Dog类型的子类,所以它不会让我大失所望。 – user7024499

+0

所以,true或false ......用你的话来说,必须意味着“每个子类都必须实现相同的初始化器”,但是......并不意味着子类必须使用该初始化器。正如我上面的示例所显而易见的,该实例是使用不同的指定初始化程序创建的。 – user7024499

+0

确实,“必需”表示它必须存在。这并不意味着它必须被使用。 – rmaddy