Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/100.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
Ios 如何在将值赋给继承的属性之前委托给超类初始值设定项_Ios_Swift_Oop_Inheritance_Initialization - Fatal编程技术网

Ios 如何在将值赋给继承的属性之前委托给超类初始值设定项

Ios 如何在将值赋给继承的属性之前委托给超类初始值设定项,ios,swift,oop,inheritance,initialization,Ios,Swift,Oop,Inheritance,Initialization,斯威夫特在这里就草签人代表团说: 指定的初始值设定项必须委托给超类初始值设定项 将值指定给继承的属性之前。如果没有,那么 指定初始值设定项指定的新值将被覆盖 超类作为其自身初始化的一部分 让我们在下面的例子中说: 类形状{ 变量颜色:字符串 初始化(颜色:字符串){ self.color=颜色 } } 类圆:形状{ 设pi=3.14 变量r:双 init(r:Double,color:String){ self.r=r super.init(颜色:color) } func区域()->Doubl

斯威夫特在这里就草签人代表团说:

指定的初始值设定项必须委托给超类初始值设定项 将值指定给继承的属性之前。如果没有,那么 指定初始值设定项指定的新值将被覆盖 超类作为其自身初始化的一部分

让我们在下面的例子中说:

类形状{
变量颜色:字符串
初始化(颜色:字符串){
self.color=颜色
}
}
类圆:形状{
设pi=3.14
变量r:双
init(r:Double,color:String){
self.r=r
super.init(颜色:color)
}
func区域()->Double{
返回pi*r*r
}
}
“在将值赋给继承属性之前委托给超类初始值设定项”是什么意思?我的假设是“继承的属性”并不意味着子类新引入的属性


将值分配给继承的属性不是一个超类初始值设定项super.init(color:color)的行为吗?如何首先将继承属性赋值,然后将其委托给超类初始值设定项?超类初始值设定项覆盖新值的示例是什么?

您的示例实际上并不涉及修改子类初始值设定项中的继承属性。继承属性是由超类声明的属性(例如示例中的
color

那篇文档说,如果您想重写超级初始化器的行为并修改子类init中继承属性的值,那么首先需要调用
super.init
,然后才能修改该值。这是因为超类声明的所有值都将在
super.init
中初始化

实际上,编译器甚至不允许您在调用
super.init
之前访问超类中声明的值,以避免文档中提到的错误

检查下面的示例,其中超类为
id
指定一个常量值,而不管
init
的输入值是什么,而子类使用输入值,因此覆盖在超类中指定的值

class Super {
    var id: Int

    init(id: Int) {
        self.id = 0
    }
}

class Sub: Super {
    let prop: String

    init(id: Int, prop: String) {
        self.prop = prop
        // The next line would actually result in the error: 'self' used in property access 'id' before 'super.init' call
        //self.id = id 
        super.init(id: id)
        self.id = id // this is where you can override a property declared by the superclass
    }
}

Sub(id: 2, prop: "") // id is correctly initialised to 2

“如何首先将继承的属性赋值,然后将其委托给超类初始值设定项?”不能这样做,这将引发编译错误。这些是Swift编译器而不是开发人员强制执行的安全检查。如果一个简单的检查失败,就会出现编译错误。本节主要介绍如何在引擎盖下工作。感谢您的回答。这有点棘手,因为您的示例在不使用修饰符的情况下重写了超类的属性
override
。我知道这是因为函数签名不同,但我假设“首先委托给超类初始值设定项”的相同规则适用于修改器
override
?@Kevvv是的,即使您重写超级init而不是添加新的init,该规则也适用