创建结构体
- 在结构体中,默认提供一个带所有属性的构造器;
- 在结构体中,默认提供一个带无初始值属性的构造器;
struct Rectangle {
var width: Double = 0.0
var height: Double = 0.0
// 默认构造方法
init() {
}
// 由结构体属性生成的默认构造方法
init(width: Double, height: Double) {
self.width = width
self.height = height
}
func area() -> Double {
return width * height
}
var descrition: String {
return "Rectangle (width: \(width), height: \(height))"
}
}
var r1 = Rectangle()
r1.width = 10
r1.height = 20
print(r1.descrition, r1.area())
var r2 = Rectangle(width: 3, height: 4)
print(r2.descrition, r2.area())
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)
let originY = center.y - (size.height / 2)
self.init(origin: Point(x: originX, y: originY), size: size)
}
}
什么情况使用结构体
结构体总是通过被复制的方式在代码中传递,因此它的值是不可修改的。
结构体实例总是通过值传递来定义你的自定义数据类型。
按照通用的准则,当符合一条或多条以下条件时,请考虑构建结构体:
- 结构体的主要目的是用来封装少量相关简单数据值。
- 有理由预计一个结构体实例在赋值或传递时,封装的数据将会被拷贝而不是被引用。
- 任何在结构体中储存的值类型属性,也将会被拷贝,而不是被引用。
- 结构体不需要去继承另一个已存在类型的属性或者行为。
举例来说,以下情境中适合使用结构体:
- 几何形状的大小,封装一个 width 属性和 height 属性,两者均为 Double 类型。
- 一定范围内的路径,封装一个 start 属性和 length 属性,两者均为 Int 类型。
- 三维坐标系内一点,封装 x,y 和 z 属性,三者均为 Double 类型。