Swift 列舉與結構體

2021-10-23 11:16:59 字數 3971 閱讀 7576

列舉簡單的說也是一種資料型別,只不過是這種資料型別只包含自定義的特定資料,它是一組有共同特性的資料的集合。

swift 的列舉類似於 objective c 和 c 的結構,列舉的功能為:

enum enumname
例如我們定義以下表示星期的列舉:

import cocoa

// 定義列舉

enum daysofaweek

var weekday = daysofaweek.thursday

weekday = .thursday

switch weekday

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

星期四
注意: 和 c 和 objective-c 不同,swift 的列舉成員在被建立時不會被賦予乙個預設的整型值。在上面的daysofaweek例子中,sundaymonday……saturday不會隱式地賦值為01……6。相反,這些列舉成員本身就有完備的值,這些值是已經明確定義好的daysofaweek型別。

var weekday = daysofaweek.thursday
weekday的型別可以在它被daysofaweek的乙個可能值初始化時推斷出來。一旦weekday被宣告為乙個daysofaweek,你可以使用乙個縮寫語法(.)將其設定為另乙個daysofaweek的值:

var weekday = .thursday
weekday的型別已知時,再次為其賦值可以省略列舉名。使用顯式型別的列舉值可以讓**具有更好的可讀性。

列舉可分為相關值與原始值。

相關值原始值

不同資料型別

相同資料型別

例項: enum

例項: enum

值的建立基於常量或變數 

預先填充的值 

相關值是當你在建立乙個基於列舉成員的新常量或變數時才會被設定,並且每次當你這麼做得時候,它的值可以是不同的。 

原始值始終是相同的 

以下例項中我們定義乙個名為 student 的列舉型別,它可以是 name 的乙個字串(string),或者是 mark 的乙個相關值(int,int,int)。

import cocoa

enum student

var studdetails = student.name("runoob")

var studmarks = student.mark(98,97,95)

switch studmarks

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

學生的成績是: 98,97,95。
原始值可以是字串,字元,或者任何整型值或浮點型值。每個原始值在它的列舉宣告中必須是唯一的。

在原始值為整數的列舉時,不需要顯式的為每乙個成員賦值,swift會自動為你賦值。

例如,當使用整數作為原始值時,隱式賦值的值依次遞增1。如果第乙個值沒有被賦初值,將會被自動置為0。

import cocoa

enum month: int

let yearmonth = month.may.rawvalue

print("數字月份為: \(yearmonth)。")

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

數字月份為: 5。
swift 結構體是構建**所用的一種通用且靈活的構造體。

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

與 c 和 objective c 不同的是:

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

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

struct namestruct
我們定義乙個名為 markstruct 的結構體 ,結構體的屬性為學生三個科目的分數,資料型別為 int:

struct markstruct
我們可以通過結構體名來訪問結構體成員。

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

import cocoa

struct studentmarks

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 astruct = marksstruct(mark: 98)

var bstruct = astruct // astruct 和 bstruct 是使用相同值的結構體!

bstruct.mark = 97

print(astruct.mark) // 98

print(bstruct.mark) // 97

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

98

97

在你的**中,你可以使用結構體來定義你的自定義資料型別。

結構體例項總是通過值傳遞來定義你的自定義資料型別。

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

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

結構體例項是通過值傳遞而不是通過引用傳遞。

import cocoa

struct markstruct

}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)

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

優異成績:

9896

100糟糕成績:

3442

13

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

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

swift與結構體

struct resolution 所有結構體都有乙個自動生成的成員逐一構造器,用於初始化新結構體例項中成員的屬性 let vga resolution width 640,height 480 let someresolution resolution println vga.width prin...

列舉與結構體

1 結構體和列舉一樣,都是在 的主體外部宣告的。1 using system 2using system.collections.generic 3using system.linq 4using system.text 56 namespace structenum 7 15 struct rou...

結構體與列舉

但是轉念一想,別人寫的畢竟是別人寫的,那是別人的,雖然我能看懂,也能為我所用,但始終不是從自己腦子裡一點點想出來的,不是自己手指在鍵盤上乙個字乙個字的敲出來的。所以儘管自己都知道了,但是還是自己寫出來,總結出來,才算真正自己的東西。好了,下面來聊一下結構體是什麼吧。1 首先它是乙個體。既然是乙個體,...