Swift 類和結構體

2021-08-20 18:54:23 字數 4467 閱讀 8890

//swift 中類和結構體的共同點:

//1. 定義屬性用於儲存值

//2. 定義方法用於提供功能

//3. 定義下標用於訪問值

//4. 定義構造器用於生成初始化值

//5. 通過擴充套件以增加預設實現的功能

//6. 符合協議以對某類提供標準功能

//class 不同於 struct 的特點:

//1. 允許乙個類繼承另乙個類的特徵

//2. 型別轉換(type casting)允許在執行時檢查和解釋乙個類例項的型別

//3. 解構器允許乙個類例項釋放任何其所被分配的資源

//4. 引用計數允許對乙個類的多次引用

//1. 定義類和結構體

//類和結構體定義方式類似

class someclass

struct somestruct

//每定義乙個類和結構體, 相當於定義了乙個 swift型別. 所以名字要uppercamelcase 方式命名(如 someclass 和somestructure等)

//屬性和方法命名用 lowercamelcase (如framerate和incrementcount)

struct resolution

class videomode

//2. 類和結構體例項

//直接加括號生成的例項, 其屬性均會被初始化為預設值

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"

//注意: 與 objective-c 語言不同的是,swift 允許直接設定結構體屬性的子屬性。上面的最後乙個例子,就是直接設定了somevideomode中resolution屬性的width這個子屬性,以上操作並不需要重新設定resolution屬性。

//3. 結構體型別的成員逐一構造器(memberwise initializers for structure types)

//所有結構體都有乙個自動生成的成員逐一構造器

//類沒有預設的成員逐一構造器

let vga = resolution(width:640, height: 480)

//4. 結構體和列舉是值型別

/*值型別被賦給乙個變數(常量)或者被傳遞給乙個函式的時候,實際上是值的拷貝。

在 swift 中所有的基本型別---整數(integer)、浮點數(floating-point)、布林值(booleans)、字串(string)、陣列(array)和字典(dictionaries),都是值型別,並且都是以結構體的形式在後台所實現。

在 swift 中,所有的結構體和列舉都是值型別。這意味著它們的例項,以及例項中所包含的任何值型別屬性,在**中傳遞的時候都會被複製。

*/let hd = resolution(width: 1920, height: 1080)

var cinema = hd

//resolution是值型別,所以cinema的值其實是hd的乙個拷貝副本,而不是hd本身

cinema.width = 2048

print("cinema is now \(cinema.width) pixels wide")

// 輸出 "cinema is now 2048 pixels wide"

print("hd is still \(hd.width ) pixels wide")

// 輸出 "hd is still 1920 pixels wide"

//列舉也是值型別

enum compasspoint

var currentdirection = compasspoint.west

let rememberdirection = currentdirection

currentdirection = .east

if rememberdirection == .west

// 輸出 "the remembered direction is still .west"

//5. class 是引用型別

//與值型別不同,引用型別在被賦予到乙個變數、常量或者被傳遞到乙個函式時,操作的是引用,其並不是拷貝。因此,引用的是已存在的例項本身而不是其拷貝。

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引數,而不改變常量的值。

//6. 恒等運算子

//因為類是引用型別,有可能有多個常量和變數在後台同時引用某乙個類例項。

//判讀兩個常量或變數是否引用同乙個類例項,可以用恒等運算子: 等價於(===), 不等價於(!==)

if teneighty === alsoteneighty

//輸出 "teneighty and alsoteneighty refer to the same resolution instance."

//請注意「等價於"(用三個等號表示,===) 與「等於"(用兩個等號表示,==)的不同:

//「等價於」表示兩個類型別(class type)的常量或者變數引用同乙個類例項。

//「等於」表示兩個例項的值「相等」或「相同」,判定時要遵照類設計者定義的評判標準,因此相比於「相等」,這是一種更加合適的叫法。

//7. 指標

//乙個 swift 常量或者變數引用乙個引用型別的例項與 c 語言中的指標類似,不同的是並不直接指向記憶體中的某個位址,不用使用 * 號。swift 中這些引用與其它的常量或變數的定義方式相同。

//8. 類和結構體的選擇

//結構體的適用場景:

//結構體的主要目的是用來封裝少量相關簡單資料值。

//有理由預計乙個結構體例項在賦值或傳遞時,封裝的資料將會被拷貝而不是被引用。

//任何在結構體中儲存的值型別屬性,也將會被拷貝,而不是被引用。

//結構體不需要去繼承另乙個已存在型別的屬性或者行為。

//合適的結構體候選者包括:

//幾何形狀的大小,封裝乙個width屬性和height屬性,兩者均為double型別。

//一定範圍內的路徑,封裝乙個start屬性和length屬性,兩者均為int型別。

//三維座標系內一點,封裝x,y和z屬性,三者均為double型別。

//在所有其它案例中,定義乙個類,生成乙個它的例項,並通過引用來管理和傳遞。實際中,這意味著絕大部分的自定義資料構造都應該是類,而非結構體。

//9. strings, arrays, dictionaries的賦值和拷貝行為

//swift 中字串(string),陣列(array)和字典(dictionary)型別均以結構體的形式實現, 是值型別. 這意味著當用它們給其它常量或變數,函式賦值時,都會被複製.

//objective-c中字串(nsstring),陣列(nsarray)和字典(nsdictionary)型別均以類的形式實現,是引用型別。

//注意: 實際 copy 由系統管理優化,只有確有必要,實際(actual)拷貝才會被執行。swift 管理所有的值拷貝以確保效能最優化的效能

Swift 結構體和類

結構體 swift結構體也具有封裝的概念 swift結構體比oc c語言裡面的結構體更加進了一步,裡面可以有方法,更接近我們的類 結構體的定義格式 struct結構體名 struct rect var width double 按構造方法賦初值 var height double 方法 func g...

Swift 類和結構體(class struct)

較傳統的oc語言,swift使用了更多的結構體 在 swift 中,所有的基本型別 整數 integer 浮點數 floating point 布林值 boolean 字串 string 陣列 array 和字典 dictionary 都是結構體型別 所以只有熟悉類和結構體各自的特性,才能編寫出更優...

Swift中類和結構體

1.類和結構體對比 swift 中類和結構體有很多共同點 與結構體相比,類還有如下的附加功能 2.類和結構體的定義語法 類和結構體有著類似的定義方式。我們通過關鍵字class和struct來分別表示類和結構體,並在一對大括號中定義它們的具體內容,如下 class videomode struct r...