Swift 提供了利用構(gòu)造作為結(jié)構(gòu)的靈活的構(gòu)建塊。 通過利用這些結(jié)構(gòu)的一次可以定義構(gòu)建體的方法和屬性。
這不同于 C 和 Objective C 編程:
結(jié)構(gòu)不用要求實現(xiàn)文件和接口。
結(jié)構(gòu)體使我們能夠創(chuàng)建一個文件并自動擴展其接口到其它塊。
在結(jié)構(gòu)體中的變量值被復(fù)制并傳遞在后續(xù)的代碼,通過返回的舊值的副本使得這些值不能被改變。
Structures are defined with a 'Struct' Keyword. struct nameStruct { Definition 1 Definition 2 --- Definition N }
考慮例如,假設(shè)要訪問包含三個科目記錄標(biāo)記的學(xué)生并找出三個科目的總和。在這里,markStruct用于初始化的結(jié)構(gòu)有三個標(biāo)記,數(shù)據(jù)類型為 'Int'。
struct MarkStruct{ var mark1: Int var mark2: Int var mark3: Int }
結(jié)構(gòu)的成員是由它的結(jié)構(gòu)名訪問。 結(jié)構(gòu)體的實例中由 'let' 關(guān)鍵字進行初始化。
struct studentMarks { var mark1 = 100 var mark2 = 200 var mark3 = 300 } let marks = studentMarks() println("Mark1 is \(marks.mark1)") println("Mark2 is \(marks.mark2)") println("Mark3 is \(marks.mark3)")
當(dāng)我們使用 playground 運行上面的程序,得到以下結(jié)果:
Mark1 is 100 Mark2 is 200 Mark3 is 300
學(xué)生成績需要訪問結(jié)構(gòu)名“studentMarks”。結(jié)構(gòu)成員被初始化為 mark1, mark2, mark3 的整數(shù)類型值。然后,結(jié)構(gòu)體 studentMarks()傳遞給 'marks' 使用 'let' 關(guān)鍵字。 'marks' 將包含結(jié)構(gòu)成員的值?,F(xiàn)在通過 '.' 訪問結(jié)構(gòu)的初始名稱的值,并打印它。
struct MarksStruct { var mark: Int init(mark: Int) { self.mark = mark } } var aStruct = MarksStruct(mark: 98) var bStruct = aStruct // aStruct and bStruct are two structs with the same value! bStruct.mark = 97 println(aStruct.mark) // 98 println(bStruct.mark) // 97
當(dāng)我們使用 playground 運行上面的程序,得到以下結(jié)果:
98 97
Swift 語言提供功能來定義的結(jié)構(gòu)體作為自定義數(shù)據(jù)類型,用于構(gòu)建功能塊。 結(jié)構(gòu)體的實例的值傳遞給定義塊來進一步的操作。
需要有結(jié)構(gòu):
封裝簡單的數(shù)據(jù)值
使用“值”而不是“引用”復(fù)制封裝數(shù)據(jù)到它的相關(guān)聯(lián)屬性
結(jié)構(gòu)體為 “復(fù)制” 和 “引用”
在 swift 中結(jié)構(gòu)體是通過其成員的值,而不是它的引用。
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 } } var marks = markStruct(mark1: 98, mark2: 96, mark3:100) println(marks.mark1) println(marks.mark2) println(marks.mark3)
當(dāng)我們使用 playground 運行上面的程序,得到以下結(jié)果:
98 96 100
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 } } var fail = markStruct(mark1: 34, mark2: 42, mark3: 13) println(fail.mark1) println(fail.mark2) println(fail.mark3)
當(dāng)我們使用 playground 運行上面的程序,得到以下結(jié)果:
34 42 13
結(jié)構(gòu)體 “markStruct” 需要它的成員首先定義:mark1, mark2 和 mark3. 現(xiàn)在,成員類的變量初始化容納整數(shù)值。之后結(jié)構(gòu)成員的副本使用 “self” 關(guān)鍵字創(chuàng)建。當(dāng)結(jié)構(gòu)成員的副本創(chuàng)建結(jié)構(gòu)體塊,其參數(shù)標(biāo)記傳遞給 'marks' 變量,它現(xiàn)在將保存學(xué)生的分?jǐn)?shù)。那么標(biāo)記打印為 98, 96, 100。 下一步對于相同的結(jié)構(gòu)成員的另一個實例命名為 'fail' 用于指向不同的標(biāo)記相同結(jié)構(gòu)體的成員。那么標(biāo)記現(xiàn)在打印為 34, 42, 13. 這清楚地說明了結(jié)構(gòu)會有成員變量的副本,傳入成員到它們即將推出的功能塊。