swift學習筆記之-類和結構體,swift學習筆記
//類和結構體
import UIKit
//類和結構體
/*
1.枚舉enum、結構體struct和String、Array、Dictionary類型,都屬於值傳遞類型,被賦值給新的常量或變數時傳遞的是值的拷貝,若聲明為常量執行個體,則不能修改它的屬性的值,即使屬性為變數
2.類class是參考型別,被賦值時傳遞的是執行個體的引用
一、類和結構體對比
Swift 中類和結構體有很多共同點。共同處在於:
定義屬性用於儲存值
定義方法用於提供功能
定義附屬指令碼用於訪問值
定義構造器用於產生初始化值
通過擴充以增加預設實現的功能
實現協議以提供某種標準功能
與結構體相比,類還有如下的附加功能:
繼承允許一個類繼承另一個類的特徵
類型轉換允許在運行時檢查和解釋一個類執行個體的類型
解構器允許一個類執行個體釋放任何其所被分配的資源
引用計數允許對一個類的多次引用
二、按照通用的準則,當符合一條或多條以下條件時,請考慮構建結構體:
1.該資料結構的主要目的是用來封裝少量相關簡單資料值。
2.有理由預計該資料結構的執行個體在被賦值或傳遞時,封裝的資料將會被拷貝而不是被引用。
3.該資料結構中儲存的實值型別屬性,也應該被拷貝,而不是被引用。
4.該資料結構不需要去繼承另一個既有類型的屬性或者行為。
*/
//結構體、類的定義
struct Resolution {
var width = 0
var height = 0
var filename = "data.txt"
}
class VideoMode {
lazy var 延遲屬性 = Resolution() //在執行個體初始化時未建立,只有在被調用時才建立
var resolution = Resolution()
var interlaced = false
var frameRate = 0.0
var name:String?
}
let someresolution = Resolution()
let somevideomode = VideoMode() //執行個體的屬性值均為預設值
let vga = Resolution(width: 1024, height: 768, filename:"file.txt") //構造體類型有成員逐一構造器,用於初始化新執行個體中的屬性值,而類執行個體無預設的成員逐一構造器!
//vga.width = 768 構造體類型的常量執行個體不能修改其任何屬性的值
var hd = vga //hd的值為vga的值的拷貝,改變hd的值與vga無關,他們是不同的結構體執行個體
hd.width = 1920
print("hd=\(hd.width) vga=\(vga.width)")
let one = somevideomode //類的常量執行個體的屬性可以更改,因為更改的是所引用的執行個體的屬性的值,而非引用本身
one.resolution = hd
one.interlaced = true
one.frameRate = 25.0
one.name = "1920i"
let two = one
two.resolution.width = 2880 //可以訪問執行個體屬性的子屬性
if two === one { //(===,!== 等階於,不等階於,one和two引用同一執行個體)
print("one的子屬性width值=\(one.resolution.width) two的子屬性width值=\(two.resolution.width)")
print("開始調用檔案:\(two.延遲屬性.filename)") //延遲屬性:在執行個體初始化時未建立,只有在被調用時才建立,(前面加“lazy”關鍵字)
}