Swift 結構體


Swift 結構體是建構程式碼所使用的一種通用且靈活的建構體。

我們可以為結構體定義屬性(常數、變數)和新增方法,從而擴展結構體的功能。

與 C 和 Objective C 不同的是:

  • 結構體不需要包含實作檔案和介面。

  • 結構體允許我們建立一個單一文件,且係統會自動產生面向其它程式碼的外部介面。

結構體總是透過被複製的方式在程式碼中傳遞,因此它的值是不可修改的。

語法

我們透過關鍵字struct 來定義結構體:

struct nameStruct { 
   Definition 1
   Definition 2
   ……
   Definition N
}

實例

我們定義一個名為MarkStruct 的結構體,結構體的屬性為學生三個科目的分數,資料型別為Int:

struct MarkStruct{
   var mark1: Int
   var mark2: Int
   var mark3: Int
}

我們可以透過結構體名來存取結構體成員。

結構體實例化使用let 關鍵字:

import Cocoa

struct studentMarks {
   var mark1 = 100
   var mark2 = 78
   var mark3 = 98
}
let marks = studentMarks()
print("Mark1 是 \(marks.mark1)")
print("Mark2 是 \(marks.mark2)")
print("Mark3 是 \(marks.mark3)")

以上程式執行輸出結果為:

Mark1 是 100
Mark2 是 78
Mark3 是 98

實例中,我們透過結構體名'studentMarks' 訪問學生的成績。結構體成員初始化為mark1, mark2, mark3,資料型別為整數。

然後我們透過使用 let 關鍵字將結構體 studentMarks()  實例化並傳遞給 marks。

最後我們就透過 . 號來存取結構體成員的值。

以下實例化透過結構體實例化時傳值並複製一個結構體:

import Cocoa

struct MarksStruct {
   var mark: Int

   init(mark: Int) {
      self.mark = mark
   }
}
var aStruct = MarksStruct(mark: 98)
var bStruct = aStruct // aStruct 和 bStruct 是使用相同值的结构体!
bStruct.mark = 97
print(aStruct.mark) // 98
print(bStruct.mark) // 97

以上程式執行輸出結果為:

98
97

結構體應用

在你的程式碼中,你可以使用結構體來定義你的自訂資料類型。

結構體實例總是透過值傳遞來定義你的自訂資料類型。

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

  • 結構體的主要目的是用來封裝少量相關簡單數據值。

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

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

  • 結構體不需要去繼承另一個已存在類型的屬性或行為。

舉例來說,以下情境中適合使用結構體:

  • #幾何形狀的大小,封裝一個width屬性和height屬性,兩者均為Double類型。

  • 一定範圍內的路徑,封裝一個start屬性和length屬性,兩者皆為Int類型。

  • 三維座標系內一點,封裝xyz屬性,三者皆為 Double類型。

結構體實例是透過值傳遞而不是透過參考傳遞。

import Cocoa

struct markStruct{
    var mark1: Int
    var mark2: Int
    var mark3: Int
    
    init(mark1: Int, mark2: Int, mark3: Int){
        self.mark1 = mark1
        self.mark2 = mark2
        self.mark3 = mark3
    }
}

print("优异成绩:")
var marks = markStruct(mark1: 98, mark2: 96, mark3:100)
print(marks.mark1)
print(marks.mark2)
print(marks.mark3)

print("糟糕成绩:")
var fail = markStruct(mark1: 34, mark2: 42, mark3: 13)
print(fail.mark1)
print(fail.mark2)
print(fail.mark3)

以上程式執行輸出結果為:

优异成绩:
98
96
100
糟糕成绩:
34
42
13

上述實例中我們定義了結構體  markStruct,三個成員屬性:mark1, mark2 和 mark3。結構體內使用成員屬性使用 self 關鍵字。

從實例中我們可以很好的理解到結構體實例是透過值傳遞的。