1.結構體和類的對比
- 定義屬性用於存儲值
- 定義方法用於提供功能
- 定義下標操作用於通過下標語法訪問它們的值
- 定義構造器用於設置初始值
- 通過擴展以增加默認實現之外的功能
- 遵循協議以提供某種標準的功能
2.與結構體相比,類有的附加功能
- 繼承:允許一個類繼承於另一個類的特徵
- 類型轉換允許在運行時檢查和解釋一個類實例的類型
- 析構器允許一個類實例釋放任何其所分配的資源
- 引用計數允許對一個類的多次引用
類支持的附加功能是以增加複雜性爲代價的。作爲一般原則,優先使用結構體,因爲它們更容易理解,僅在適當或者必要時才使用類
實際上:你的大多數自定義數據類型都會是
結構體
和枚舉
//類與結構體
*/
struct SomeStructure {
}
class PJSomeClass {
}
struct PJResolution {
var width = 0
var height = 0
}
class PJVideoMode {
var resolution = PJResolution()
var interlaced = false
var frameRate = 0.0
var name: String?
}
let someRe = PJResolution()
let someVideoMode = PJVideoMode()
someVideoMode.resolution.width = 10
someVideoMode.resolution.height = 20
print("someRe is \(someVideoMode.resolution.width) ,op = \(someVideoMode.interlaced) ppp = \(String(describing: someVideoMode.name))")
//結構體和類都使用構造器語法來創建新的實例。構造器語法的最簡形式是在結構體或者類的類型名字後跟着一個空括號
//結構體類型的成員逐一構造器
//所有的結構體都一個自動生成的成員逐一構造器,用於初始化新結構體中成員的屬性。
//類實例沒有默認的成員逐一構造器
let vga = PJResolution(width: 23, height: 98)
//結構體和枚舉是值類型
//標準庫定義的集合,例如:數組、字典、字符串,都對複製進行了優化以降低性能成本。新集合不會被立即複製,而是跟原集合共享同一份內存
//共享同樣的元素,在集合的某個副本要被修改前,下回複製它的元素
let hfgg = PJResolution(width: 1920, height: 1080)
var cinme = hfgg
cinme.width = 20000
print(cinme)
enum CompassPoint {
case north , south , east ,west
mutating func turnNorth(){
self = .north
}
}
var currentDirection = CompassPoint.west
let rememberDirection = currentDirection
currentDirection.turnNorth()
print(currentDirection) // morth
print(rememberDirection) //west
//類是引用類型
//與值類型不同,引用類型再被賦予到一個變量、常量或者被傳遞到一個函數時,其值不會被拷貝,使用的是實例的引用,而不是其拷貝
let tenenrt = PJVideoMode()
tenenrt.resolution = hfgg
tenenrt.interlaced = true
tenenrt.name = "1080i"
tenenrt.frameRate = 34.5
print(tenenrt)
let alseTen = tenenrt
alseTen.frameRate = 30.0
print(alseTen)
//恆等運算符
//類是引用類型,所以多個長量和變量可能在幕後同時引用同一個類實例
//用來檢測兩個變量或者常量是不是引用的同一類實例
if tenenrt === alseTen {
print("tenenrt and alseTen refer to the same Mode instance")
}
//=== 相同 表示兩個類類型(class type)的常量或者變量引用同一個類實例
//== “等於”表示兩個實例的值“相等”或“等價”