
创建结构体
- 在结构体中,默认提供一个带所有属性的构造器;
- 在结构体中,默认提供一个带无初始值属性的构造器;
struct Rectangle {var width: Double = 0.0var height: Double = 0.0// 默认构造方法init() {}// 由结构体属性生成的默认构造方法init(width: Double, height: Double) {self.width = widthself.height = height}func area() -> Double {return width * height}var descrition: String {return "Rectangle (width: \(width), height: \(height))"}}var r1 = Rectangle()r1.width = 10r1.height = 20print(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 = originself.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 类型。
