1. ?在開發(fā)iOS應用之前需要學習一些Swift語言基礎,在Swift Playground上練習Swift語法是一個快捷、有效同時十分有趣的過程。與iOS應用開發(fā)相比氓皱,Swift Playground是一個獨立的工程項目,使用擴展名為playground的項目文件波材,它是蘋果公司首次與Swift語言一起推出的項目股淡。我們知道Swift是一種腳本風格的語言,而Swift Playground正是針對這個特性推出的運行平臺(類似可運行腳本的控制臺)廷区,可以與代碼交互直接看到執(zhí)行結果唯灵。Playground在英語中意為操場-學生、青少年嬉戲玩耍的地方隙轻,Swift Playground的logo是一個兩個兒童玩耍蹺蹺板的圖案埠帕,如下圖。
2. ?本文的學習目標
1) 區(qū)分常量和變量
2) 知道何時使用隱式和顯式的類型聲明
3) 理解使用可選類型(optionals)和可選類型綁定(optional binging)的好處
4) 區(qū)分可選類型(optionals)和隱式解包可選類型(unwrapped optionals)
5) 理解條件語句和循環(huán)的目的
6) 使用switch語句用于超出二進制條件的條件分支
7) 使用where子句在條件語句中加入附加約束
8) 區(qū)分函數(shù)玖绿、方法和構造器(initializers)
9) 區(qū)分類敛瓷、結構體和枚舉
10) 理解繼承(inheritance)和協(xié)議(protocol)所遵循的語法
11) 輸入和使用UIKit
3 ?基本類型
3.1? 常量在第一次聲明后就始終數(shù)值不變,而變量則是可以聲明后仍可改變數(shù)值斑匪。一個常量被指為非改變的(immutable)呐籽,一個變量則被指為可改變的(mutable)。使用let聲明一個常量蚀瘸,使用var聲明一個變量狡蝶。
上面用到了類型判斷(type inference),根據(jù)myVariable后面的初始值判斷myVariable是Int類型苍姜,同樣myConstant也是Int類型牢酵。完整的語句如下:
如果初始值和實際類型不一致,則需要顯式聲明類型衙猪,explicitDouble的初始值是Int馍乙,因此需要顯式聲明Double類型。
數(shù)據(jù)的類型永遠不會隱式轉(zhuǎn)換成其他類型垫释,需要進行顯式轉(zhuǎn)換處理丝格。下面是一個Int轉(zhuǎn)換成String的例子。
另一種更簡單的方法在字符串中添加數(shù)值類型棵譬,使用“\”和”()”显蝌,如下:
3.2? 可選類型(optionals)
使用”?”可選類型聲明數(shù)值可能為空(nil)
可選類型的數(shù)值需要使用解包(unwrap)后,才能進行賦值订咸,一個簡單直接的方法:使用強制解包”!”進行賦值曼尊,只有使用解包操作符才能保證賦的值不是nil。
3.3? 數(shù)組
數(shù)組是一種有序集合的數(shù)據(jù)類型脏嚷,使用”[ ]”創(chuàng)建骆撇,數(shù)組的第一個元素下標為0。
創(chuàng)建一個空數(shù)組:
3.4? 隱式解包可選類型
隱式解包可選類型是一個可選類型可以當作一個非可選類型數(shù)據(jù)父叙,不需要每次使用時對其進行解包神郊,在聲明類型后面使用”!”而不是”?”肴裙。
控制流
Swift有兩類控制流語句:1)條件語句,如if和switch涌乳;2)循環(huán)語句蜻懦,如for-in和while。
4.1? if語句
4.1.1? if語句嵌套在for-in語句內(nèi)
4.1.2? 在if語句中使用可選類型綁定檢查可選類型是否有值
如果可選類型的值是nil夕晓,條件判斷為false宛乃,將跳過if后面{}中的代碼。否則运授,可選類型的值被解包然后賦值給let后面的常量name烤惊。
4.1.3? 單個if語句可以綁定多個數(shù)據(jù)
添加where子句到條件判斷的語句中,下面如果所有數(shù)據(jù)綁定成功同時所有條件得到滿足吁朦,if語句會得到執(zhí)行柒室。
4.2? Switch語句
Swift的Switch語句十分強大,支持所有類型的數(shù)據(jù)和大范圍比較操作逗宜,不僅僅限于整數(shù)和等于比較雄右。下面switch語句在vegetable字符串上,比較各種狀況和執(zhí)行其匹配操作纺讲。
上面switch允許多個由”,”分隔的匹配狀況擂仍,與if語句不同,這些分隔狀況只要有一個得到滿足就會執(zhí)行匹配操作熬甚。switch語句的case子句中一旦執(zhí)行了匹配操作逢渔,其執(zhí)行完成后就會退出switch語句,因此case子句不需要調(diào)用break語句乡括。
switch語句必須保證至少有一個case子句得到執(zhí)行肃廓,因此有時需要提供default子句,當所有case子句沒有匹配執(zhí)行后诲泌,default子句會得到執(zhí)行操作盲赊。
4.3? for-in循環(huán)
使用范圍(Range)操作符
半開范圍操作符(..<)不執(zhí)行最高上標數(shù)值,上面代碼中i=4不會執(zhí)行敷扫,而閉合范圍操作符(…)會執(zhí)行最高上標數(shù)值哀蘑,下面循環(huán)會從0到4執(zhí)行5次,下劃線”_”表示泛匹配(wildcard)葵第。
函數(shù)和方法
5.1? 函數(shù)
函數(shù)是一種可重用的绘迁、命名的代碼片段,可用于程序中多個地方被調(diào)用卒密。使用func聲明一個函數(shù)缀台,函數(shù)聲明包含零個及以上的參數(shù),以name: Type的形式書寫栅受。函數(shù)可以有一個返回類型将硝,在尾部以->形式書寫,函數(shù)的實現(xiàn)部分在”{ }”里面屏镊。
調(diào)用這個函數(shù)時依疼,不用書寫第一個參數(shù)名稱,后面的參數(shù)需要書寫參數(shù)名稱而芥。
5.2? 方法
在特定類型中定義的函數(shù)稱為方法(methods)律罢,方法顯式的關聯(lián)于其所在定義的類型,只能在該類型或者類型的子類中被調(diào)用棍丐。下面例子中误辑,調(diào)用了String的方法hasSuffix。
調(diào)用方法使用點(“.”)語法歌逢,下面調(diào)用數(shù)組的insert方法巾钉。
類(Classes)和構造器(Initializers)
6.1? 類
在面向?qū)ο缶幊讨校绦虻男袨榇蠖鄶?shù)是基于對象之間的交互秘案,每個對象是一個類的一個實例砰苍。類通過屬性(properties)保存附加的信息,使用方法定義類本身的行為阱高。使用class聲明定義一個類赚导。屬性聲明和常量、變量的聲明一樣赤惊,寫在類的聲明定義中吼旧;同樣方法也和函數(shù)的聲明一樣寫在類的聲明定義中。下面例子聲明一個Share類未舟,擁有一個numberOfSides屬性和simpleDescription()方法圈暗。
下面例子創(chuàng)建Shape類的一個實例-shape對象,對其屬性賦值处面,調(diào)用方法simpleDescription()厂置。
6.2? 構造器
構造器是一個準備用來生成一個類實例的方法,其中有對美國屬性設置初始值和完成相關設置魂角。使用init聲明構造器昵济,下面例子定義一個新類NameShape。
不能直接使用init去調(diào)用構造器野揪,而是使用類名和其全部構造器的參數(shù)访忿。
6.3? 父類和子類
子類繼承父類的行為,子類中指向父類使用super斯稳,聲明一個子類和父類使用”:”海铆。子類的方法使用override重寫父類中同名的方法,如果沒有用override聲明的方法與父類的方法使用相同的名稱和參數(shù)挣惰,會報告編譯器錯誤卧斟;同樣使用override聲明的方法在父類中沒有對應的方法殴边,也會報告編譯器錯誤。下面例子定義Square類珍语,父類是NamedShape锤岸。
6.4? 失敗構造器(failable initializers)
有時對象的構造過程需要失敗處理,例如傳入的參數(shù)超出了指定的范圍板乙,或者缺少需要的數(shù)據(jù)是偷,這時不能成功初始化對象就要調(diào)用失敗構造器,失敗構造器能返回nil募逞,使用init?聲明一個失敗構造器蛋铆。
6.5? 聲明多個構造器
在類中,可以有多個關鍵字關聯(lián)聲明的構造器放接。特定(designated)構造器不需要任何關鍵字聲明刺啦,它是類的主構造器(primary initializer),類的其他構造器必須最終調(diào)用主構造器透乾。使用convenience關鍵字聲明的構造器洪燥,視為常規(guī)構造器,作為二級構造器用于增加類的附加行為或定制化工作乳乌,最終需要調(diào)用主構造器捧韵。類中使用required關鍵字聲明的構造器,表明該類和所有子類都要實現(xiàn)這個構造器汉操,并且在子類的這個構造器前也需要使用required關鍵字聲明再来。
6.6? 類型轉(zhuǎn)化(type casting)
類型轉(zhuǎn)化是一種檢查實例類型的方式,判斷一個實例是否是一個父類或者子類的實例對象磷瘤。類型轉(zhuǎn)化有兩個操作符:可選類型轉(zhuǎn)化操作符(as?)和強制類型轉(zhuǎn)化操作符(as!)芒篷,可選類型轉(zhuǎn)化操作符返回一個可選類型數(shù)據(jù),這個數(shù)據(jù)可以是空(nil)表明轉(zhuǎn)化失敗采缚,強制類型轉(zhuǎn)化操作符使用在轉(zhuǎn)化結果總是成功针炉,如果失敗則觸發(fā)運行時錯誤。下面例子顯示使用可選類型轉(zhuǎn)化操作符(as?)檢查數(shù)組中的每個shape是square或者triangle扳抽。
枚舉和結構體
在Swift語言中篡帕,類不是定義數(shù)據(jù)類型的唯一方式,枚舉和結構體具有和類相似的能力贸呢。
7.1? 枚舉
枚舉可以定義一組普通類型的镰烧、相關聯(lián)的數(shù)據(jù),枚舉的使用是一種類型安全(type-safe)楞陷,枚舉可以有自己的方法怔鳖。使用enum創(chuàng)建一個枚舉數(shù)據(jù)。
上面例子中固蛾,枚舉的raw-value類型是Int结执,定義第一個rawvalue的數(shù)值度陆,后面的rawvalue會自動遞增加1。枚舉的raw-value類型也可以使用字符串或者浮點數(shù)献幔。
7.2? 結構體
結構體支持類的大多數(shù)行為坚芜,包括方法和構造器。結構體和類的一個最重要的不同在于:結構體總是傳數(shù)值方式被使用斜姥,而類是傳引用方式。結構體適用于定義輕量的數(shù)據(jù)類型沧竟,不需要像繼承和類型轉(zhuǎn)化這些能力铸敏。使用struct創(chuàng)建一個結構體。
協(xié)議
協(xié)議定義了一些方法悟泵、屬性和其他實現(xiàn)指定任務和功能的藍圖杈笔,并不實際提供任何實際的實現(xiàn)。類糕非、結構體和枚舉可以遵循協(xié)議蒙具,提供實際實現(xiàn)。使用protocol聲明一個協(xié)議朽肥。
上面例子中禁筏,{ get }在simpleDescription屬性后面,表明該屬性是只讀的衡招。
類篱昔、結構體和枚舉使用“類名: 協(xié)議名”的形式遵循一個協(xié)議,當需要遵循多個協(xié)議同時聲明一個父類時始腾,父類需要在第一個位置州刽,如“子類名: 父類, 協(xié)議1, 協(xié)議2, …, 協(xié)議n”。下面例子浪箭,SimpleClass遵循ExampleProtocol協(xié)議穗椅,提供實現(xiàn)simpleDescription屬性和adjust方法。
協(xié)議是第一級類型奶栖,可以與其他命名的類型相似匹表,可以創(chuàng)建協(xié)議實例。下面例子驼抹,創(chuàng)建ExampleProtocol數(shù)組桑孩,并對數(shù)組中的實例依此調(diào)用adjust方法。
Swift語言和Cocoa Touch
Cocoa Touch是蘋果開發(fā)iOS應用的框架集合框冀,Swift語言提供與Cocoa Touch無縫的互操作能力流椒。
iOS應用開發(fā)最常見的框架就是UIKit,在Swift語言使用UIKit框架的方法
下面是創(chuàng)建一個紅色的正方形視圖明也。
10.? Swift Playground界面