




下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
【移動應用開發技術】2.8枚舉(Enumerations)
本頁內容包含:枚舉語法(EnumerationSyntax)匹配枚舉值與Swith語句(MatchingEnumerationValueswithaSwitchStatement)相關值(AssociatedValues)原始值(RawValues)枚舉定義了一個通用類型的一組相關的值,使你可以在你的代碼中以一個安全的方式來使用這些值。如果你熟悉C語言,你就會知道,在C語言中枚舉指定相關名稱為一組整型值。Swift中的枚舉更加靈活,不必給每一個枚舉成員提供一個值。如果一個值(被認為是“原始”值)被提供給每個枚舉成員,則該值可以是一個字符串,一個字符,或是一個整型值或浮點值。此外,枚舉成員可以指定任何類型的相關值存儲到枚舉成員值中,就像其他語言中的聯合體(unions)和變體(variants)。你可以定義一組通用的相關成員作為枚舉的一部分,每一組都有不同的一組與它相關的適當類型的數值。在Swift中,枚舉類型是一等(first-class)類型。它們采用了很多傳統上只被類(class)所支持的特征,例如計算型屬性(computedproperties),用于提供關于枚舉當前值的附加信息,實例方法(instancemethods),用于提供和枚舉所代表的值相關聯的功能。枚舉也可以定義構造函數(initializers)來提供一個初始成員值;可以在原始的實現基礎上擴展它們的功能;可以遵守協議(protocols)來提供標準的功能。欲了解更多相關功能,請參見屬性(Properties),方法(Methods),構造過程(Initialization),擴展(Extensions)和協議(Protocols)。枚舉語法使用enum關鍵詞并且把它們的整個定義放在一對大括號內:enum
SomeEnumeration
{
//
enumeration
definition
goes
here
}以下是指南針四個方向的一個例子:enum
CompassPoint
{
case
North
case
South
case
East
case
West
}一個枚舉中被定義的值(例如
North,South,East和West)是枚舉的成員值(或者成員)。case關鍵詞表明新的一行成員值將被定義。注意:不像C和Objective-C一樣,Swift的枚舉成員在被創建時不會被賦予一個默認的整數值。在上面的CompassPoints例子中,North,South,East和West不是隱式的等于0,1,2和3。相反的,這些不同的枚舉成員在CompassPoint的一種顯示定義中擁有各自不同的值。注意:不像C和Objective-C一樣,Swift的枚舉成員在被創建時不會被賦予一個默認的整數值。在上面的CompassPoints例子中,North,South,East和West不是隱式的等于0,1,2和3。相反的,這些不同的枚舉成員在CompassPoint的一種顯示定義中擁有各自不同的值。多個成員值可以出現在同一行上,用逗號隔開:enum
Planet
{
case
Mercury,
Venus,
Earth,
Mars,
Jupiter,
Saturn,
Uranus,
Neptune
}每個枚舉定義了一個全新的類型。像Swift中其他類型一樣,它們的名字(例如CompassPoint和Planet)必須以一個大寫字母開頭。給枚舉類型起一個單數名字而不是復數名字,以便于讀起來更加容易理解:var
directionToHead
=
CompassPoint.WestdirectionToHead的類型被推斷當它被CompassPoint的一個可能值初始化。一旦directionToHead被聲明為一個CompassPoint,你可以使用更短的點(.)語法將其設置為另一個CompassPoint的值:directionToHead
=
.EastdirectionToHead的類型已知時,當設定它的值時,你可以不再寫類型名。使用顯式類型的枚舉值可以讓代碼具有更好的可讀性。匹配枚舉值和Switch語句你可以匹配單個枚舉值和switch語句:directionToHead
=
.South
switch
directionToHead
{
case
.North:
println("Lots
of
planets
have
a
north")
case
.South:
println("Watch
out
for
penguins")
case
.East:
println("Where
the
sun
rises")
case
.West:
println("Where
the
skies
are
blue")
}
//
輸出
"Watch
out
for
penguins”你可以如此理解這段代碼:“考慮directionToHead的值。當它等于.North,打印“Lotsofplanetshaveanorth”。當它等于.South,打印“Watchoutforpenguins”。”等等依次類推。正如在控制流(ControlFlow)中介紹,當考慮一個枚舉的成員們時,一個switch語句必須全面。如果忽略了.West這種情況,上面那段代碼將無法通過編譯,因為它沒有考慮到CompassPoint的全部成員。全面性的要求確保了枚舉成員不會被意外遺漏。當不需要匹配每個枚舉成員的時候,你可以提供一個默認default分支來涵蓋所有未明確被提出的任何成員:let
somePlanet
=
Planet.Earth
switch
somePlanet
{
case
.Earth:
println("Mostly
harmless")
default:
println("Not
a
safe
place
for
humans")
}
//
輸出
"Mostly
harmless”相關值(AssociatedValues)上一小節的例子演示了一個枚舉的成員是如何被定義(分類)的。你可以為Planet.Earth設置一個常量或則變量,并且在之后查看這個值。不管怎樣,如果有時候能夠把其他類型的相關值和成員值一起存儲起來會很有用。這能讓你存儲成員值之外的自定義信息,并且當你每次在代碼中使用該成員時允許這個信息產生變化。你可以定義Swift的枚舉存儲任何類型的相關值,如果需要的話,每個成員的數據類型可以是各不相同的。枚舉的這種特性跟其他語言中的可辨識聯合(discriminatedunions),標簽聯合(taggedunions),或者變體(variants)相似。例如,假設一個庫存跟蹤系統需要利用兩種不同類型的條形碼來跟蹤商品。有些商品上標有UPC-A格式的一維碼,它使用數字0到9。每一個條形碼都有一個代表“數字系統”的數字,該數字后接10個代表“標識符”的數字。最后一個數字是“檢查”位,用來驗證代碼是否被正確掃描:其他商品上標有QR碼格式的二維碼,它可以使用任何ISO8859-1字符,并且可以編碼一個最多擁有2,953字符的字符串:對于庫存跟蹤系統來說,能夠把UPC-A碼作為三個整型值的元組,和把QR碼作為一個任何長度的字符串存儲起來是方便的。在Swift中,用來定義兩種商品條碼的枚舉是這樣子的:enum
Barcode
{
case
UPCA(Int,
Int,
Int)
case
QRCode(String)
}以上代碼可以這么理解:“定義一個名為Barcode的枚舉類型,它可以是UPCA的一個相關值(Int,Int,Int),或者QRCode的一個字符串類型(String)相關值。”這個定義不提供任何Int或String的實際值,它只是定義了,當Barcode常量和變量等于Barcode.UPCA或Barcode.QRCode時,相關值的類型。然后可以使用任何一種條碼類型創建新的條碼,如:var
productBarcode
=
Barcode.UPCA(8,
85909_51226,
3)以上例子創建了一個名為productBarcode的新變量,并且賦給它一個Barcode.UPCA的相關元組值(8,8590951226,3)。提供的“標識符”值在整數字中有一個下劃線,使其便于閱讀條形碼。同一個商品可以被分配給一個不同類型的條形碼,如:productBarcode
=
.QRCode("ABCDEFGHIJKLMNOP")這時,原始的Barcode.UPCA和其整數值被新的Barcode.QRCode和其字符串值所替代。條形碼的常量和變量可以存儲一個.UPCA或者一個.QRCode(連同它的相關值),但是在任何指定時間只能存儲其中之一。像以前那樣,不同的條形碼類型可以使用一個switch語句來檢查,然而這次相關值可以被提取作為switch語句的一部分。你可以在switch的case分支代碼中提取每個相關值作為一個常量(用let前綴)或者作為一個變量(用var前綴)來使用:switch
productBarcode
{
case
.UPCA(let
numberSystem,
let
identifier,
let
check):
println("UPC-A
with
value
of
\(numberSystem),
\(identifier),
\(check).")
case
.QRCode(let
productCode):
println("QR
code
with
value
of
\(productCode).")
}
//
輸出
"QR
code
with
value
of
ABCDEFGHIJKLMNOP.”如果一個枚舉成員的所有相關值被提取為常量,或者它們全部被提取為變量,為了簡潔,你可以只放置一個var或者let標注在成員名稱前:switch
productBarcode
{
case
let
.UPCA(numberSystem,
identifier,
check):
println("UPC-A
with
value
of
\(numberSystem),
\(identifier),
\(check).")
case
let
.QRCode(productCode):
println("QR
code
with
value
of
\(productCode).")
}
//
輸出
"QR
code
with
value
of
ABCDEFGHIJKLMNOP."原始值(RawValues)在AssociatedValues小節的條形碼例子中演示了一個枚舉的成員如何聲明它們存儲不同類型的相關值。作為相關值的替代,枚舉成員可以被默認值(稱為原始值)預先填充,其中這些原始值具有相同的類型。這里是一個枚舉成員存儲原始ASCII值的例子:enum
ASCIIControlCharacter:
Character
{
case
Tab
=
"\t"
case
LineFeed
=
"\n"
case
CarriageReturn
=
"\r"
}在這里,稱為ASCIIControlCharacter的枚舉的原始值類型被定義為字符型Character,并被設置了一些比較常見的ASCII控制字符。字符值的描述請詳見字符串和字符StringsandCharacters部分。注意,原始值和相關值是不相同的。當你開始在你的代碼中定義枚舉的時候原始值是被預先填充的值,像上述三個ASCII碼。對于一個特定的枚舉成員,它的原始值始終是相同的。相關值是當你在創建一個基于枚舉成員的新常量或變量時才會被設置,并且每次當你這么做得時候,它的值可以是不同的。原始值可以是字符串,字符,或者任何整型值或浮點型值。每個原始值在它的枚舉聲明中必須是唯一的。當整型值被用于原始值,如果其他枚舉成員沒有值時,它們會自動遞增。下面的枚舉是對之前Planet這個枚舉的一個細化,利用原始整型值來表示每個planet在太陽系中的順序:enum
Planet:
Int
{
case
Mercury
=
1,
Venus,
Earth,
Mars,
Jupiter,
Saturn,
Uranus,
Neptune
}自動遞增意味著Planet.Venus的原始值是2,依次類推。使用枚舉成員的toRaw方法可以訪問該枚舉成員的原始值:let
earthsOrder
=
Planet.Earth.toRaw()
//
earthsOrder
is
3使用枚舉的fromRaw方法來試圖找到具有特定原始值的枚舉成員。這個例子通過原始值7識別Uranus:let
possiblePlanet
=
Planet.fromRaw(7)
//
possiblePlanet
is
of
type
Planet?
and
equals
Planet.Uranus然而,并非所有可能的Int值都可以找到一個匹配的行星。正因為如此,fr
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 行政組織理論的知識拓展策略試題及答案
- 計算機二級MySQL與數據安全試題及答案
- 2025年N1叉車司機理論考試題及答案
- 網絡技術領域的標桿企業分析試題及答案
- 行政組織溝通與協調考題及答案
- 數據庫結構設計的規范試題及答案
- 公司工會干部管理制度
- 學校軍訓安全管理制度
- 在建油庫安全管理制度
- 土地報批部門管理制度
- (完整版)一般現在時-現在進行時-一般過去時練習題及答案
- 2024年10月自考15040習概試題及答案含評分參考
- 2024年心衰治療指南解讀
- TSGD7002-2023-壓力管道元件型式試驗規則
- 交通運輸測繪成果及檔案管理制度
- 2023年公司財務制度大全
- 2023年鐵塔動環監控系統統一互聯B接口技術規范培訓資料
- 電工技術培訓方案
- 中國偏頭痛診治指南(第一版)2023解讀
- GB/T 15688-2024動植物油脂不溶性雜質含量的測定
- 北京市西城區2021-2022學年八年級下學期期末道德與法治試題(試題+答案)
評論
0/150
提交評論