值类型的构造器代理
构造器通过调用其它构造器来完成实例的部分构造过程称为构造器代理,能够减少多个构造器间的代码重复
构造器的代理规则:
值类型 | 类类型 |
---|---|
不支持继承,所以构造器代理的过程相对简单,因为它们只能代理给本身提供的其它构造器。 你可以使用self.init 在自定义的构造器中引用其它的属于相同值类型 的构造器。 |
它可以继承自其它类 ,这意味着类有责任保证其所有继承的存储型属性在构造时也能正确的初始化。 |
//值类型的构造器代理
class ConstructorAgent{
struct Size {
var width = 0.0,height = 0.0
}
struct Point {
var x = 0.0, y = 0.0
}
struct Rect {
var origin = Point()
var size = Size()
init(){}
init(origin:Point, size:Size){
self.origin = origin
self.size = size
}
init(center:Point, size:Size){
let originX = center.x - (size.width/2.0)
let originY = center.y - (size.height / 2.0)
//将新值 调用(或代理给)init(origin:size:)构造器
self.init(origin: Point(x: originX, y: originY), size: size)
}
var x: Double {
get {
origin.x
}
}
var y: Double {
get
{
origin.y
}
}
}
}
调用
func constructorAgentFunc(){
//origin和size属性都使用定义时的默认值
let basicRect = Rect()
print("size 初始值:\((basicRect.size.width, basicRect.size.height))")
print("origin 初始值:\((basicRect.x, basicRect.y))")
//调用origin构造器 将origin和size的参数值赋给对应的存储型属性
let originRect = Rect(origin: Point(x: 10, y: 10), size: Size(width: 20, height: 20))
print("size 新值:\((originRect.size.width,originRect.size.height))")
print("origin 新值:\((originRect.origin.x,originRect.origin.y))")
//通过center构造器利用size值计算出origin坐标值
//调用(或代理给)init(origin:size:)构造器来将新的origin和size值赋值到对应的属性中
let centerRect = Rect(center: Point(x: 18.0, y: 20.0), size: Size(width: 8.0, height: 8.0))
print("size 新值:\((centerRect.size.width,centerRect.size.height))")
print("origin 新值:\((centerRect.origin.x,centerRect.origin.y))")
}
调用结果
size 初始值:(0.0, 0.0)
origin 初始值:(0.0, 0.0)
size 新值:(20.0, 20.0)
origin 新值:(10.0, 10.0)
size 新值:(8.0, 8.0)
origin 新值:(14.0, 16.0)
网友评论