版本記錄
版本號 | 時間 |
---|---|
V1.0 | 2017.07.28 |
前言
??我是swift2.0的時候開始接觸的伞辛,記得那時候還不是很穩(wěn)定,公司的項目也都是用oc做的,并不對swift很重視隧甚,我自己學(xué)了一段時間,到現(xiàn)在swift3.0+已經(jīng)出來了渡冻,自己平時也不寫戚扳,忘記的也差不多了,正好項目這段時間已經(jīng)上線了族吻,不是很忙帽借,我就可以每天總結(jié)一點了珠增,希望對自己對大家有所幫助。在總結(jié)的時候我會對比oc進行說明砍艾,有代碼的我會給出相關(guān)比對代碼蒂教。
1. swift簡單總結(jié)(一)—— 數(shù)據(jù)簡單值和類型轉(zhuǎn)換
2. swift簡單總結(jié)(二)—— 簡單值和控制流
3. swift簡單總結(jié)(三)—— 循環(huán)控制和函數(shù)
4. swift簡單總結(jié)(四)—— 函數(shù)和類
5. swift簡單總結(jié)(五)—— 枚舉和結(jié)構(gòu)體
6. swift簡單總結(jié)(六)—— 協(xié)議擴展與泛型
7. swift簡單總結(jié)(七)—— 數(shù)據(jù)類型
8. swift簡單總結(jié)(八)—— 別名、布爾值與元組
9. swift簡單總結(jié)(九)—— 可選值和斷言
10. swift簡單總結(jié)(十)—— 運算符
11. swift簡單總結(jié)(十一)—— 字符串和字符
12. swift簡單總結(jié)(十二)—— 集合類型之數(shù)組
13. swift簡單總結(jié)(十三)—— 集合類型之字典
14. swift簡單總結(jié)(十四)—— 控制流
15. swift簡單總結(jié)(十五)—— 控制轉(zhuǎn)移語句
16. swift簡單總結(jié)(十六)—— 函數(shù)
17. swift簡單總結(jié)(十七)—— 閉包(Closures)
枚舉
??不知道大家是否還記得在OC
中枚舉必須是整型脆荷,但是在swift
中對這方面進行了優(yōu)化凝垛,突破了這方面的限制。swift
中不必給每一個枚舉成員提供一個值蜓谋,如果一個值被提供給每個枚舉成員梦皮,則該值可以是一個字符串,一個字符桃焕,或者是一個整型值或者浮點值剑肯。
還要說明的是,在swift
中枚舉類型是一等類型(first - class)
观堂,它們采用了很多傳統(tǒng)上只被類(class)
所支持的特征让网。比如:
- 計算型屬性
(computed properties)
,用于提供關(guān)于枚舉當前值的附加信息型将。 - 實例方法
(instance methods)
寂祥,用于提供和枚舉所代表的值相關(guān)聯(lián)的功能。 - 枚舉也可以定義構(gòu)造函數(shù)
(initializers)
來提供一個初始成員值七兜。 - 可以在原始的實現(xiàn)基礎(chǔ)上擴展它們的功能丸凭。
- 可以遵守協(xié)議
(protocols)
來提供標準功能。
下面從以下四個方面進行講解:
- 枚舉語法
(Enumeration Syntax)
- 匹配枚舉值與switch語句
(Matching Enumeration Values with a Switch Statement)
- 相關(guān)值
(Associated Values)
- 原始值
(Raw Values)
枚舉語法
下面我們看一個例子腕铸。
enum ComposePoint {
case North
case South
case East
case West
}
這里要注意:OC
中可以給第一個成員賦初始值惜犀,然后下面的成員就會順著一次加1,但是swift
中并不會這么做狠裹,這些枚舉成員在ComposePoint
的顯示定義中擁有各自不同的值虽界。
這些成員值還可以寫在同一行上,用逗號隔開涛菠。
enum ComposePoint {
case North, South, East, West
}
再次與OC
相比莉御,可見swift
更加靈活多變,功能強大俗冻。
將枚舉值賦值給變量或者常量時礁叔,可以按照下例進行。
class JJSwiftVC: UIViewController
{
override func viewDidLoad()
{
super.viewDidLoad()
view.backgroundColor = UIColor.lightGray
//枚舉賦值情況
var direction = ComposePoint.North
direction = .West
}
}
匹配枚舉值與switch語句
枚舉值可以和switch
語句結(jié)合起來使用迄薄,看下面這個例子琅关。
class JJSwiftVC: UIViewController
{
override func viewDidLoad()
{
super.viewDidLoad()
view.backgroundColor = UIColor.lightGray
//枚舉賦值情況
var direction = ComposePoint.North
direction = .West
switch direction {
case .North:
print("North")
case .South:
print("South")
case .West:
print("West")
case .East:
print("East")
}
}
}
下面看輸出結(jié)果
West
相關(guān)值
如果有時候能夠把其他類型的相關(guān)值和成員值一起存儲起來會很有用,這能讓你存儲成員值之外的自定義信息讥蔽,并且當你每次在代碼中使用該成員時允許這個信息產(chǎn)生變化涣易。swift
的枚舉可以存儲任意類型的相關(guān)值画机,如果需要的話,每個成員的數(shù)據(jù)類型可以都是各不相同的新症,枚舉的這種特性和其他語言中的辨識聯(lián)合discriminated unions
步氏,標簽聯(lián)合tagged unions
,變體variants
類似账劲。
看下面這個例子戳护。
enum Barcode {
case UPCA(Int, Int, Int)
case QRCode(String)
}
class JJSwiftVC: UIViewController
{
override func viewDidLoad()
{
super.viewDidLoad()
view.backgroundColor = UIColor.lightGray
var productBarCode = Barcode.UPCA(8, 85909_51226, 3)
productBarCode = .QRCode("ABCDSFRGHJ")
switch productBarCode {
case .UPCA(let numberSystem, let identify, let check):
print("UPC-A with value of \(numberSystem), \(identify), \(check)")
case .QRCode(let productCode):
print("QR code with value of \(productCode)")
}
}
}
下面看輸出結(jié)果
QR code with value of ABCDSFRGHJ
如上金抡,不同的條形碼類型可以使用一個switch
語句檢查瀑焦,然而這次相關(guān)值可以被提取坐位switch
語句的一部分,你可以在switch
的case
分支代碼中提取每個相關(guān)值作為一個常量或者作為一個變量來使用梗肝。
如果一個枚舉成員的所有相關(guān)值被提去為常量榛瓮,或者它們?nèi)勘惶崛樽兞浚瑸榱撕啙嵨谆鳎憧梢灾环胖靡粋€var
或者let
標注在成員名稱前禀晓。具體代碼如下:
switch productBarCode {
case let .UPCA( numberSystem, identify, check):
print("UPC-A with value of \(numberSystem), \(identify), \(check)")
case let .QRCode( productCode):
print("QR code with value of \(productCode)")
}
下面看輸出結(jié)果
QR code with value of ABCDSFRGHJ
這里只是更改了代碼組織結(jié)構(gòu),并沒有改變最后的值坝锰,這里注意粹懒,只有同一個分支里面所有數(shù)據(jù)相關(guān)值類型一樣時,數(shù)據(jù)類型才可以提到最前面顷级。
原始值
在講述相關(guān)值的時候凫乖,一個枚舉成員可以存儲不同類型的相關(guān)值,作為相關(guān)值的替代弓颈,枚舉成員可以被默認值(稱為原始值)預(yù)先填充帽芽,其中這些原始值具有相同的類型。
下面看個簡單例子翔冀。
enum ASCIICharacter : Character {
case Tab = "\t"
case LineFeed = "\n"
case CarriageReturn = "\r"
}
這里导街,ASCIICharacter
的枚舉的原始值類型被定義為Character
。
注意:原始值和相關(guān)值是不相同的纤子,當你開始在你的代碼中定義枚舉的時候原始值是被預(yù)先填充的值搬瑰,像上述三個ASCII值,對于一個特定的枚舉成員控硼,它的原始值始終是相同的泽论,相關(guān)值是當你在創(chuàng)建一個基于枚舉成員的新常量或者變量時才會被設(shè)置,并且每次當你這么做的時候象颖,它的值可以是不同的佩厚。
原始值的類型可以是字符串,字符说订,或者任何整型值或浮點型值抄瓦,每個原始值在它的枚舉聲明中必須是唯一的潮瓶,當整型值被用于原始值,如果其他枚舉成員沒有值時钙姊,它們會自動遞增训唱,最后這一點和OC
是一樣的悯姊。
可以通過枚舉成員的屬性rawValue
獲取原始值。
下面看這個簡單例子。
enum Planet : Int {
case Mercury = 1, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune
}
class JJSwiftVC: UIViewController
{
override func viewDidLoad()
{
super.viewDidLoad()
view.backgroundColor = UIColor.lightGray
let earthOrder = Planet.Earth.rawValue
print(earthOrder)
}
}
下面看輸出結(jié)果
3
還可以通過參數(shù)為rawValue
構(gòu)造函數(shù)創(chuàng)建特定原始值的枚舉炮温,下面看這個例子。
class JJSwiftVC: UIViewController
{
override func viewDidLoad()
{
super.viewDidLoad()
view.backgroundColor = UIColor.lightGray
let possiblePlanet = Planet(rawValue: 7)
print(possiblePlanet)
}
}
下面看輸出結(jié)果
Optional(JJSwift.Planet.Uranus)
大家可以看見精堕,這個值的類型是可選的绰更,也就是說這個值可能存在也可能不存在,下面我們看一下不存在的例子婚温。
enum Planet : Int {
case Mercury = 1, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune
}
class JJSwiftVC: UIViewController
{
override func viewDidLoad()
{
super.viewDidLoad()
view.backgroundColor = UIColor.lightGray
let possibleValue = 9
if let somePlanet = Planet(rawValue: possibleValue) {
switch somePlanet {
case .Earth:
print("Human Home")
default:
print("NO Humans")
}
}
else {
print("There is not a planet at position \(possibleValue)")
}
}
}
下面看輸出結(jié)果
There is not a planet at position 9
后記
未完描焰,待續(xù)~~~