在子类中使用便利初始化(Swift)
我在Xcode中使用游乐场,我的对象没有用它们的名称初始化。我觉得这是因为我在子类中错误地使用了便利init,我想知道在子类中使用便利init的正确方法是什么。我已经阅读了其他类似的问题,但我认为我的问题不同于在子类中使用便利初始化(Swift),swift,initialization,subclass,Swift,Initialization,Subclass,我在Xcode中使用游乐场,我的对象没有用它们的名称初始化。我觉得这是因为我在子类中错误地使用了便利init,我想知道在子类中使用便利init的正确方法是什么。我已经阅读了其他类似的问题,但我认为我的问题不同于覆盖inits和便利inits class Animal { var name:String init(name:String) { self.name = name } convenience init() { self.ini
覆盖inits
和便利inits
class Animal
{
var name:String
init(name:String)
{
self.name = name
}
convenience init() { self.init(name: "") }
func speak() { }
}
class Fox: Animal
{
override init(name: String)
{
super.init(name: name)
}
convenience init() { self.init(name: "Fox") }
override func speak()
{
println("Ring")
}
}
class Cat: Animal
{
override init(name: String)
{
super.init(name: name)
}
convenience init() { self.init(name:"Cat") }
override func speak() {
println("Meow")
}
}
class Dog: Animal {
override init(name: String) {
super.init(name: name)
}
convenience init()
{
self.init(name:"Dog")
}
override func speak() {
println("Woof")
}
}
let animals = [ Dog(), Cat(), Fox()]
for animal in animals
{
animal.speak()
}
代码中没有错误。 我认为问题在于理解Xcode的游乐场是如何工作的。 可能您按下了“显示结果”图标,看到的是这样的画面: 但这告诉我们这三种动物的“模块名”点“类名”;前缀为uu lldb_expr_25(在我的图片中),但在操场上是一个动态的模块名 事实上,您应该看看“助理编辑”: 要查看speck()方法的输出,请执行以下操作: 只要对代码稍加修改,这一点就更加明显: 因此,输出为:
让我根据我目前了解的情况回答- 重写inits类似于将相同的方法重写为相同的超类init方法。在这里,您不能添加额外的行为作为init方法参数,例如:
class Animal
{
var name:String
init(name:String)
{
self.name = name
}
func speak() { }
}
class Cat: Animal
{
override init(name: String)
{
super.init(name: name)
}
override func speak() {
println("Meow")
}
}
便利inits类似于子类的自定义init方法,意味着如果您想在子类中实现init方法,但需要与超类init方法一起实现一些额外的行为。例如:
class Animal
{
var name:String
init(name:String)
{
self.name = name
}
func speak() { }
}
class Cat: Animal
{
var type: String = "Maine Coons"
convenience init(type:string, name: String)
{
self.type = type
self.init(name: name)
}
override func speak() {
println("Meow")
}
}
我希望它能帮助你。
谢谢有什么问题吗?你的<代码>适用于动物中的动物…适合我。您不需要在子类中重写init,但在重写时,这不是问题。speak()无法正常工作。我得到的输出是:uuulldb_expr_13.Dog uulldb_expr_13.Cat uuulldb_expr_13.Fox