《Swift从入门到精通》(五):类-结构体
2021-09-29 本文已影响0人
萧1帅
-
类和结构体的共同点
-
可以定义属性
-
可以定义方法
-
可以用下标语法去访问(见下面的示例代码)
-
定义初始化器
-
可以通过扩展扩展其功能,使其超出默认实现
-
遵守协议以提供其它标准功能
struct Matrix { let rows: Int, columns: Int var grid: [Double] init(rows: Int, columns: Int) { self.rows = rows self.columns = columns grid = Array(repeating: 0.0, count: rows * columns) } func indexIsValid(row: Int, column: Int) -> Bool { return row >= 0 && row < rows && column >= 0 && column < columns } subscript(row: Int, column: Int) -> Double { get { assert(indexIsValid(row: row, column: column), "Index out of range") return grid[(row * columns) + column] } set { assert(indexIsValid(row: row, column: column), "Index out of range") grid[(row * columns) + column] = newValue } } } // 初始化一个矩阵变量 var matrix = Matrix(rows: 2, columns: 2) // 可以在下图1看到初始化后的结果 // 通过subscript语法改变值 matrix[0, 1] = 1.5 matrix[1, 0] = 3.2 // 结果是下图2
图1
图2
-
-
类特有的功能
- 可以继承,使一个类能够继承另一个类的特征。
- 类型转换,能够在运行时检查和解释类实例的类型。
- 反初始化器,类的实例能够释放它所分配的任何资源。
- 引用计数允许对类实例的多个引用
-
结构体(Structure)
-
结构体是值类型(见下图)
结构体值类型示意图struct Resolution { var width = 0 var height = 0 } let someResolution = Resolution() let hd = Resolution(width: 1920, height: 1080) var cinema = hd cinema.width = 2048 print("cinema is now \(cinema.width) pixels wide") // Prints "cinema is now 2048 pixels wide" print("hd is still \(hd.width) pixels wide") // Prints "hd is still 1920 pixels wide" // 见下图
-
所有的结构体都有一个编译器自动生成的初始化器,主要是要保证所有成员都有初始值
-
如果自定义了初始化器,编译器就不会自动生成初始化器
// 可以尝试以下代码,检查以下代码的正确性 // 例一 struct Point { var x: Int = 0 var y: Int = 0 } var p1 = Point(x: 1, y: 1) var p2 = Point(x: 1) var p3 = Point(y: 1) var p4 = Point() // 例二 struct Point { var x: Int = 0 var y: Int } var p1 = Point(x: 1, y: 1) var p2 = Point(x: 1) var p3 = Point(y: 1) var p4 = Point() // 例三 struct Point { var x: Int? var y: Int? } var p1 = Point(x: 1, y: 1) var p2 = Point(x: 1) var p3 = Point(y: 1) var p4 = Point()
-
-
类(Class)
-
类是引用类型(见下图)
类引用类型示意图class VideoMode { var resolution = Resolution() var interlaced = false var frameRate = 0.0 var name: String? } let tenEighty = VideoMode() tenEighty.resolution = hd tenEighty.interlaced = true tenEighty.name = "1080i" tenEighty.frameRate = 25.0 let alsoTenEighty = tenEighty alsoTenEighty.frameRate = 30.0 // 见下图 // (不)恒等运算符 === 和 !==,这两个符号的功能是:找出两个常量或变量是否引用了一个类的完全相同的实例 if tenEighty === alsoTenEighty { print("tenEighty and alsoTenEighty refer to the same VideoMode instance.") } // Prints "tenEighty and alsoTenEighty refer to the same VideoMode instance."
-
编译器不会为类自动生成传入成员值的初始化器,如果类里的成员值没有初始化,器编译器连无参的初始化也不会自动生成
// 尝试以下代码,看是否有自动生成初始化器 class Point { var x: Int = 1 var y: Int = 1 } var p1 = Point(x: 2, y: 2) // false var p2 = Point(x: 2) // false var p3 = Point(y: 2) // false var p4 = Point() // true
-