Swift學習筆記 七 類和結構體

2021-07-04 17:29:22 字數 3784 閱讀 7257

類和結構體的比較

1---->

相同點

定義屬性用於儲存值

定義方法用於提供功能

定義下標用於通過下標語法訪問值

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

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

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

2---->

與結構體相比,類還有如下的附加功能

繼承允許乙個類繼承另乙個類的特徵

型別轉換允許在執行時檢查和解釋乙個類例項的型別

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

引用計數允許對乙個類的多次引用 注意

:結構體總是通過被複製的方式在**中傳遞,因此請不要使用引用計數。

語法定義

定義結構體和定義類的示例

乙個名為

resolution

的結構體

,這個結構體包含了兩個名為

width

和height

的儲存屬性。儲存屬性是**和儲存在類或結構體中的常量或變數。當這兩個屬性被初始化為整數

0的時候,它們會被推斷為

int型別。

struct resolution
定義了乙個名為

videomode

的類

class videomode

建立類和結構體的例項

let someresolution = resolution()//結構體

let somevideomode = videomode()//類

屬性訪問

(直接通過點語法訪問例項中的屬性)

println("the width of someresolution is \(someresolution.width)")

somevideomode.resolution.width = 12880

println("the width of somevideomode is now \(somevideomode.resolution.width)")

注意:

與objective-c

語言不同的是,

swift

允許直接設定結構體屬性的子屬性。上面的最後乙個例子,就是直接設定了

somevideomode

中resolution

屬性的width

這個子屬性,以上操作並不需要從新設定

resolution

屬性。

結構體型別的成員初始化

(與結構體不同,類例項沒有預設的成員逐一構造器)

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

結構體和列舉是值型別

值型別被賦予給乙個變數,常數或者本身被傳遞給乙個函式的時候。實際上操作的是其的拷貝。在

swift

中,所有的基本型別:整數

(integer)

、浮點數

(floating-point)

、布林值

(booleans)

、字串

(string)

、陣列(array)

和字典(dictionaries)

,都是值型別,並且都是以結構體的形式在後台所實現。 在

swift

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

(深拷貝

)height

let hd = resolution(width: 1920, heigth: 1080)

var cinema = hd

因為resolution

是乙個結構體,所以

cinema

的值其實是

hd的乙個拷貝副本,而不是

hd本身。儘管hd和

cinema

有著相同的寬

(width)

和高(height)

屬性,但是在後台中,它們是兩個完全不同的例項。

cinema.width = 2048

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

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

類是引用型別

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

let teneighty = videomode()

teneighty.resolution = hd

teneighty.interlaced = true

teneighty.name = "1080i"

teneighty.framerate = 25.0

//alsoteneighty物件指向teneighty物件指向的記憶體空間,這兩個物件指向了同一塊記憶體空間

let alsoteneighty = teneighty

alsoteneighty.framerate = 30.0

println("the framerate property of teneighty is now \(teneighty.framerate)")

// 輸出 "the framerate property of theeighty is now 30.0"

識別符號使用識別符號

"==="

或者"!=="

可以判斷兩個常量或者變數是否指向同乙個類的例項 if

teneighty

===

alsoteneighty 注意

:===和==

的區別(==

僅表示兩個物件值相等)

指標類似於c語言

,swift

中的常量和變數指向引用型別的例項

,而不是直接指向記憶體中乙個位址

,並且不需要你寫乙個星號

(*)表示您正在建立乙個引用。

類和結構體之間的選擇

結構體例項總是通過值傳遞,類例項總是通過引用傳遞。這意味兩者適用不同的任務。當你的在考慮乙個工程專案的資料構造和功能的時候,你需要決定每個資料構造是定義成類還是結構體。

按照通用的準則,當符合一條或多條以下條件時,請考慮構建結構體:

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

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

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

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

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

①幾何形狀的大小,封裝乙個

width

屬性和height

屬性,兩者均為

double

型別。

②一定範圍內的路徑,封裝乙個

start

屬性和length

屬性,兩者均為

int型別。

③三維座標系內一點,封裝x,

y和z屬性,三者均為

double

型別。

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

swift學習筆記 4 結構體和類

類和結構體 相同點 1.類和結構體都可以定義屬性和方法 這是和c oc中的結構體的最大區別 2.類和結構體中都能定義構造器方法 不同點 1.類可以在析構體deinit中釋放資源,結構體不可以 2.類可以繼承.結構體是不能被繼承 3.類是乙個引用型別,乙個例項可以有多個引用,操作的是例項的本身 結構體...

Swift學習筆記系列 (8)類和結構體

tags swift 學習筆記 為什麼把類和結構體一起講?因為除了類的複雜應用部分,二者很相似。定義屬性來儲存資料 定義方法來實現功能 定義下標提供訪問值 定義構造方法設定初始值 預設實現之外,可以擴充套件功能 遵循協議 protocol 來提提供標準功能 乙個類繼承另乙個類的特徵 類例項可以在執行...

Swift學習 類和結構體補充

類的構造器 class zs init name string 析構 與之前寫oc中的dealloc功能一樣 deinit 預設構造器 var zs zs 呼叫了重寫的構造方法 var zs1 zs name 帥不 zs1.name 定義結構體 struct length 呼叫了預設的構造器 ini...