Swift初始化规则混乱 [英] Swift Initialization Rule Confusion

查看:66
本文介绍了Swift初始化规则混乱的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

规则1

如果您的子类未定义任何指定的初始化器,它将自动继承其所有超类的指定初始化器.

If your subclass doesn’t define any designated initializers, it automatically inherits all of its superclass designated initializers.

困惑::我在子类中提供了一个指定的初始值设定项.这意味着没有任何超类指定的初始值设定项将归结为子类.但是我仍然需要编写 override 关键字以提供子类中任何超类指定的初始化器的实现(这意味着指定为init的超类归结为子类).规则1指出,如果我提供了指定为初始化的子类,那么指定的超类将不会崩溃. (仅当我们没有为子类提供任何指定的init时,重写才有意义.)

Confusion: I provided one designated initializer in sub class. Its means no super class designated initializer will comes down to subclass. But I still needs to write override keyword to provide implementation of any super class designated initializer in sub class(which means super class designated init comes down to sub class). Rule 1 says if I provided subclass designated initializer then super class designated won't comes down. (Override only makes sense if we did not provided any designated init for sub class.)

class Food{
    var name : String
    init(foodName :String) {
        self.name = foodName
    }
}

class RecipieIngredient : Food{
    var quantity : Int
    init(fName :String, quantity :Int) {
        self.quantity = quantity
        super.init(foodName: fName)
    }

    override convenience init (foodName :String){
        self.init(fName: foodName, quantity: 1)
    }
}

推荐答案

这是因为init()不是受保护的方法.因此,如果您在子类中定义init()方法,则编译器将不知道您是指超类还是子类的init()方法. 'override'清除了这个问题.

It's because init() is not a protected method. So, if you define an init() method in the subclass, the compiler doesn't know whether you mean the init() method of the superclass, or the subclass. 'override' clears this up.

这篇关于Swift初始化规则混乱的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆