Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在子类中使用便利初始化(Swift)_Swift_Initialization_Subclass - Fatal编程技术网

在子类中使用便利初始化(Swift)

在子类中使用便利初始化(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

我在Xcode中使用游乐场,我的对象没有用它们的名称初始化。我觉得这是因为我在子类中错误地使用了便利init,我想知道在子类中使用便利init的正确方法是什么。我已经阅读了其他类似的问题,但我认为我的问题不同于
覆盖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