定义
struct Resolution { var width = 0 var height = 0 } class VideoMode { var resolution = Resolution() var interlaced = false var frameRate = 0.0 var name: String? } let someResolution = Resolution() let someVideoMode = VideoMode() print("The width of someResolution is \(someResolution.width)") // 输出 "The width of someResolution is 0" print("The width of someVideoMode is \(someVideoMode.resolution.width)") // 输出 "The width of someVideoMode is 0" someVideoMode.resolution.width = 1280 print("The width of someVideoMode is now \(someVideoMode.resolution.width)") // 输出 "The width of someVideoMode is now 1280"
结构体成员逐一构造器
let vga = Resolution(width:640,height: 480)
与结构体不同,类实例没有默认的成员逐一构造器。
结构体和枚举是值类型
let hd = Resolution(width: 1920,height: 1080) var cinema = hd cinema.width = 2048 print("cinema is now \(cinema.width) pixels wide") // 输出 "cinema is now 2048 pixels wide" //然而,初始的hd实例中width属性还是1920 print("hd is still \(hd.width ) pixels wide") // 输出 "hd is still 1920 pixels wide"
enum CompassPoint { case North,South,East,West } var currentDirection = CompassPoint.West let rememberedDirection = currentDirection currentDirection = .East if rememberedDirection == .West { print("The remembered direction is still .West") } // 输出 "The remembered direction is still .West"
类是引用类型
let hd = Resolution(width: 1920,height: 1080) let tenEighty = VideoMode() tenEighty.resolution = hd tenEighty.interlaced = true tenEighty.name = "1080i" tenEighty.frameRate = 25.0 let alsoTenEighty = tenEighty alsoTenEighty.frameRate = 30.0 print("The frameRate property of tenEighty is now \(tenEighty.frameRate)") // 输出 "The frameRate property of theEighty is now 30.0"
需要注意的是tenEighty和alsoTenEighty被声明为常量((constants)而不是变量。
然而你依然可以改变tenEighty.frameRate和alsoTenEighty.frameRate,因为这两个常量本身不会改变。
它们并不存储这个VideoMode实例,在后台仅仅是对VideoMode实例的引用。
所以,改变的是被引用的基础VideoMode的frameRate参数,而不改变常量的值。
恒等运算符
if tenEighty === alsoTenEighty { print("tenEighty and alsoTenEighty refer to the same Resolution instance.") } //输出 "tenEighty and alsoTenEighty refer to the same Resolution instance."
请注意“等价于"(用三个等号表示,===) 与“等于"(用两个等号表示,==)的不同:
“等价于”表示两个类类型(class type)的常量或者变量引用同一个类实例。
“等于”表示两个实例的值“相等”或“相同”,判定时要遵照类设计者定义定义的评判标准,因此相比于“相等”,这是一种更加合适的叫法。
类和结构体的选择
结构体实例总是通过值传递,类实例总是通过引用传递。这意味两者适用不同的任务。
当你在考虑一个工程项目的数据构造和功能的时候,你需要决定每个数据构造是定义成类还是结构体。
结构体的主要目的是用来封装少量相关简单数据值。
有理由预计一个结构体实例在赋值或传递时,封装的数据将会被拷贝而不是被引用。
任何在结构体中储存的值类型属性,也将会被拷贝,而不是被引用。
结构体不需要去继承另一个已存在类型的属性或者行为。
结构体的主要目的是用来封装少量相关简单数据值。
有理由预计一个结构体实例在赋值或传递时,封装的数据将会被拷贝而不是被引用。
任何在结构体中储存的值类型属性,也将会被拷贝,而不是被引用。
结构体不需要去继承另一个已存在类型的属性或者行为。
合适的结构体候选者包括:
几何形状的大小,封装一个width属性和height属性,两者均为Double类型。
一定范围内的路径,封装一个start属性和length属性,两者均为Int类型。
三维坐标系内一点,封装x,y和z属性,三者均为Double类型。
几何形状的大小,封装一个width属性和height属性,两者均为Double类型。
一定范围内的路径,封装一个start属性和length属性,两者均为Int类型。
三维坐标系内一点,封装x,y和z属性,三者均为Double类型。
集合类型的赋值和拷贝
Swift 中字符串(String),数组(Array)和字典(Dictionary)类型均以结构体的形式实现。
原文链接:https://www.f2er.com/swift/326572.html