您现在的位置是:首页 >技术交流 >【Swift】构造函数init继承的规则网站首页技术交流
【Swift】构造函数init继承的规则
简介【Swift】构造函数init继承的规则
总结:
1、子类未自定义指定构造器 -> 【继承全部父类构造器,包含指定和便利构造器】
2、子类自定义指定构造器 且 重载了父类的指定构造器【仅继承父类的便利构造器】
3、子类自定义指定构造器 未 重载父类的指定构造器【不继承父类任何构造器】
构造器的自动继承
如上所述,子类在默认情况下不会继承父类的构造器。但是如果满足特定条件,父类构造器是可以被自动继承的。事实上,这意味着对于许多常见场景你不必重写父类的构造器,并且可以在安全的情况下以最小的代价继承父类的构造器。
假设你为子类中引入的所有新属性都提供了默认值,以下 2 个规则将适用:
规则 1
如果子类没有定义任何指定构造器,它将自动继承父类所有的指定构造器。
规则 2
如果子类提供了所有父类指定构造器的实现——无论是通过规则 1 继承过来的,还是提供了自定义实现——它将自动继承父类所有的便利构造器。
即使你在子类中添加了更多的便利构造器,这两条规则仍然适用。
注意
子类可以将父类的指定构造器实现为便利构造器来满足规则 2。
基于官方的案例参考:
class Food {
var name: String
init(name: String) {
self.name = name
}
convenience init(type:String) {
self.init(name: "[Unnamed]")
}
}
class RecipeIngredient: Food {
var quantity: Int
init(name: String, quantity: Int) {
self.quantity = quantity
super.init(name: name)
}
override convenience init(name: String) {
/*
1、重载了父类的指定构造器且使用了便利构造器的方式
2、满足了【重载父类指定构造器】的条件,则自动继承父类全部便利构造器!
*/
self.init(name: name, quantity: 1)
}
}
class ShoppingListItem: RecipeIngredient {
/*
1、子类没有定义任何指定构造器,它将自动继承父类所有的指定构造器。
*/
var purchased = false
var description: String {
var output = "(quantity) x (name)"
output += purchased ? " ✔" : " ✘"
return output
}
}
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。