9. Swift 结构体 Struct.png

创建结构体

  1. 在结构体中,默认提供一个带所有属性的构造器;
  2. 在结构体中,默认提供一个带无初始值属性的构造器;
  1. struct Rectangle {
  2. var width: Double = 0.0
  3. var height: Double = 0.0
  4. // 默认构造方法
  5. init() {
  6. }
  7. // 由结构体属性生成的默认构造方法
  8. init(width: Double, height: Double) {
  9. self.width = width
  10. self.height = height
  11. }
  12. func area() -> Double {
  13. return width * height
  14. }
  15. var descrition: String {
  16. return "Rectangle (width: \(width), height: \(height))"
  17. }
  18. }
  19. var r1 = Rectangle()
  20. r1.width = 10
  21. r1.height = 20
  22. print(r1.descrition, r1.area())
  23. var r2 = Rectangle(width: 3, height: 4)
  24. print(r2.descrition, r2.area())
  1. struct Size {
  2. var width = 0.0, height = 0.0
  3. }
  4. struct Point {
  5. var x = 0.0, y = 0.0
  6. }
  7. struct Rect {
  8. var origin = Point()
  9. var size = Size()
  10. init() {}
  11. init(origin: Point, size: Size) {
  12. self.origin = origin
  13. self.size = size
  14. }
  15. init(center: Point, size: Size) {
  16. let originX = center.x - (size.width / 2)
  17. let originY = center.y - (size.height / 2)
  18. self.init(origin: Point(x: originX, y: originY), size: size)
  19. }
  20. }

什么情况使用结构体

结构体总是通过被复制的方式在代码中传递,因此它的值是不可修改的。

结构体实例总是通过值传递来定义你的自定义数据类型。
按照通用的准则,当符合一条或多条以下条件时,请考虑构建结构体

  • 结构体的主要目的是用来封装少量相关简单数据值。
  • 有理由预计一个结构体实例在赋值或传递时,封装的数据将会被拷贝而不是被引用。
  • 任何在结构体中储存的值类型属性,也将会被拷贝,而不是被引用。
  • 结构体不需要去继承另一个已存在类型的属性或者行为。

举例来说,以下情境中适合使用结构体:

  • 几何形状的大小,封装一个 width 属性和 height 属性,两者均为 Double 类型。
  • 一定范围内的路径,封装一个 start 属性和 length 属性,两者均为 Int 类型。
  • 三维坐标系内一点,封装 x,y 和 z 属性,三者均为 Double 类型。