Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.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中进行子分类时理解init()_Swift_Inheritance_Subclass_Init - Fatal编程技术网

在Swift中进行子分类时理解init()

在Swift中进行子分类时理解init(),swift,inheritance,subclass,init,Swift,Inheritance,Subclass,Init,从已具有初始值设定项的类继承时,如何添加自定义初始值设定项 我有一个Vehicle类,它有一个初始化器,它接受一个参数name。我要做的是从这个车辆类继承,为新类创建另一个初始值设定项,但继续使用现有的初始值设定项 class Car: Vehicle { var engine: Double init(make: String, engine:Double){ self.engine = engine super.init(make: make

从已具有初始值设定项的类继承时,如何添加自定义初始值设定项

我有一个
Vehicle
类,它有一个初始化器,它接受一个参数
name
。我要做的是从这个
车辆
类继承,为新类创建另一个初始值设定项,但继续使用现有的初始值设定项

class Car: Vehicle {
    var engine: Double

    init(make: String, engine:Double){
        self.engine = engine
        super.init(make: make)
    }
}
基类(这里没有问题): 新类(不工作): 这就是我希望能够做到的。。。重新使用现有的初始值设定项和新的初始值设定项。
let cobalt = Car(make:"Chevy" engine: 2.5)

子类中的任何指定初始值设定项都必须从其直接超类调用指定的初始值设定项:

类类型的初始值设定项委托

简化指定和便利之间的关系 草签人,Swift适用以下三条授权规则 初始化者之间的调用:

规则1指定的初始值设定项必须调用指定的初始值设定项 从其直接超类

因此,您可以构造
Car
的指定初始值设定项来接受两个参数,
make
engine
,并使用后者初始化子类的成员属性
engine
,然后使用提供的
make
参数调用超类的指定初始值设定项(提供给子类初始值设定项)作为超类初始值设定项的参数

class Car: Vehicle {
    var engine: Double

    init(make: String, engine:Double){
        self.engine = engine
        super.init(make: make)
    }
}

子类中的任何指定初始值设定项都必须从其直接超类调用指定的初始值设定项:

类类型的初始值设定项委托

简化指定和便利之间的关系 草签人,Swift适用以下三条授权规则 初始化者之间的调用:

规则1指定的初始值设定项必须调用指定的初始值设定项 从其直接超类

因此,您可以构造
Car
的指定初始值设定项来接受两个参数,
make
engine
,并使用后者初始化子类的成员属性
engine
,然后使用提供的
make
参数调用超类的指定初始值设定项(提供给子类初始值设定项)作为超类初始值设定项的参数

class Car: Vehicle {
    var engine: Double

    init(make: String, engine:Double){
        self.engine = engine
        super.init(make: make)
    }
}

非常感谢。为什么在这种情况下忽略了
覆盖
修饰符?
车辆
没有与
init匹配的声明(make:String,engine:Double)
,因此您没有重写任何内容。您只在子类的声明与父类的声明匹配时使用
重写
,通知编译器您知道您实际上正在重写现有声明。非常感谢。为什么在这种情况下省略
重写
修饰符?
车辆
doesn没有与
init(make:String,engine:Double)
匹配的声明,因此您没有重写任何内容。只有在子类的声明与父类的声明匹配时,才使用
override
,通知编译器您知道您实际上正在重写现有的声明。