一個單一文件中定義一個類或者結構體,系統將會自動生成面向其它代碼的外部接口。
類和結構體的異同
類和結構體的共同點:
定義屬性用于存儲值
定義方法用于提供功能
定義下標操作使得可以通過下標語法來訪問實例所包含的值
定義構造器用于生成初始化值
通過擴展以增加默認實現的功能
實現協議以提供某種標準功能類還有如下的附加功能:
繼承允許一個類繼承另一個類的特征
類型轉換允許在運行時檢查和解釋一個類實例的類型
析構器允許一個類實例釋放任何其所被分配的資源
引用計數允許對一個類的多次引用結構體總是通過被復制的方式在代碼中傳遞,不使用引用計數。
新類或結構體命名用UpperCamelCase(Swift類型的命名規范)
屬性和方法命名用lowerCamelCase
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()
- 結構體的成員逐一構造器
let hd = Resolution(width: 1920, height: 1080)
- 結構體和枚舉是值類型。所有的基本類型:整數(Integer)、浮 點數(floating-point)、布爾值(Boolean)、字符串(string)、數組(array)和字典(dictionary),都是 值類型,并且在底層都是以結構體的形式所實現。
var cinema = hd
cinema.width = 2048
print("hd is still \(hd.width) pixels wide")
- 類是引用類型
let tenEighty = VideoMode()
tenEighty.resolution = hd
tenEighty.interlaced = true
tenEighty.name = "1080i"
tenEighty.frameRate = 25.0
let alsoTenEighty = tenEighty
alsoTenEighty.frameRate = 30.0
tenEighty.frameRate
// 恒等運算符:判定兩個常量或者變量是否引用同一個類實例
tenEighty === alsoTenEighty
建議選擇結構體的情況:
- 該數據結構的主要目的是用來封裝少量相關簡單數據值。
- 有理由預計該數據結構的實例在被賦值或傳遞時,封裝的數據將會被拷貝而不是被引用。
- 該數據結構中儲存的值類型屬性,也應該被拷貝,而不是被引用。
- 該數據結構不需要去繼承另一個既有類型的屬性或者行為。
struct Shape {
var width: Double = 1.0
var height: Double = 1.0
}
struct Path {
var start: Int
var length: Int
}
struct Point {
var x: Double
var y: Double
var z: Double
}
Swift中的String,Array和Dictionary是值類型,OC中的NSString, NSArray和NSDictionary是引用類型
playground文件在andyRon/LearnSwift