版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
Swift開(kāi)發(fā)指南基于ios8正式版修訂目錄\h第一部分基礎(chǔ)篇\h第1章準(zhǔn)備開(kāi)始\h1.1本書(shū)學(xué)習(xí)路線圖\h1.2本書(shū)中的約定\h1.2.1示例代碼約定\h1.2.2圖示的約定\h1.3Xcode開(kāi)發(fā)工具\(yùn)h1.3.1Xcode安裝和卸載\h1.3.2Xcode界面\h1.4如何使用API幫助\h1.5本章小結(jié)\h1.6同步練習(xí)\h第2章第一個(gè)Swift程序\h2.1使用Playground編寫(xiě)\h2.1.1編程利器Playground\h2.1.2編寫(xiě)HelloWorld程序\h2.2代碼解釋\h2.3本章小結(jié)\h2.4同步練習(xí)\h第3章Swift基本語(yǔ)法\h3.1標(biāo)識(shí)符和關(guān)鍵字\h3.1.1標(biāo)識(shí)符\h3.1.2關(guān)鍵字\h3.2常量和變量\h3.2.1常量\h3.2.2變量\h3.2.3命名規(guī)范\h3.3注釋\h3.4表達(dá)式\h3.5本章小結(jié)\h3.6同步練習(xí)\h第4章基本運(yùn)算符\h4.1算術(shù)運(yùn)算符\h4.1.1一元運(yùn)算符\h4.1.2二元運(yùn)算符\h4.1.3算術(shù)賦值運(yùn)算符\h4.2關(guān)系運(yùn)算符\h4.3邏輯運(yùn)算符\h4.4位運(yùn)算符\h4.5其他運(yùn)算符\h4.6本章小結(jié)\h4.7同步練習(xí)\h第5章基本數(shù)據(jù)類(lèi)型\h5.1Swift數(shù)據(jù)類(lèi)型\h5.2整型\h5.3浮點(diǎn)型\h5.4數(shù)字表示方式\h5.4.1進(jìn)制數(shù)字表示\h5.4.2指數(shù)表示\h5.4.3其他表示\h5.5數(shù)字類(lèi)型之間的轉(zhuǎn)換\h5.5.1整型之間的轉(zhuǎn)換\h5.5.2整型與浮點(diǎn)型之間的轉(zhuǎn)換\h5.6布爾型\h5.7元組類(lèi)型\h5.8本章小結(jié)\h5.9同步練習(xí)\h第6章字符和字符串\h6.1字符\h6.1.1Unicode編碼\h6.1.2轉(zhuǎn)義符\h6.2創(chuàng)建字符串\h6.3字符串可變性\h6.4字符串比較\h6.4.1大小和相等比較\h6.4.2前綴和后綴比較\h6.5本章小結(jié)\h6.6同步練習(xí)\h第7章控制語(yǔ)句\h7.1分支語(yǔ)句\h7.1.1條件語(yǔ)句if\h7.1.2多分支語(yǔ)句switch\h7.1.3在switch中使用范圍匹配\h7.1.4在switch中比較元組類(lèi)型\h7.2循環(huán)語(yǔ)句\h7.2.1while語(yǔ)句\h7.2.2dowhile語(yǔ)句\h7.2.3for語(yǔ)句\h7.2.4forin語(yǔ)句\h7.3跳轉(zhuǎn)語(yǔ)句\h7.3.1break語(yǔ)句\h7.3.2continue語(yǔ)句\h7.3.3fallthrough語(yǔ)句\h7.4本章小結(jié)\h7.5同步練習(xí)\h第8章集合\h8.1數(shù)組集合\h8.1.1數(shù)組聲明與初始化\h8.1.2數(shù)組的修改\h8.1.3數(shù)組遍歷\h8.2字典集合\h8.2.1字典聲明與初始化\h8.2.2字典的修改\h8.2.3字典遍歷\h8.3集合的復(fù)制\h8.3.1字典復(fù)制\h8.3.2數(shù)組復(fù)制\h8.4本章小結(jié)\h8.5同步練習(xí)\h第9章函數(shù)\h9.1使用函數(shù)\h9.2傳遞參數(shù)\h9.2.1使用外部參數(shù)名\h9.2.2參數(shù)默認(rèn)值\h9.2.3可變參數(shù)\h9.2.4參數(shù)的傳遞引用\h9.3函數(shù)返回值\h9.3.1無(wú)返回值函數(shù)\h9.3.2多返回值函數(shù)\h9.4函數(shù)類(lèi)型\h9.4.1作為函數(shù)返回類(lèi)型使用\h9.4.2作為參數(shù)類(lèi)型使用\h9.5函數(shù)重載\h9.6嵌套函數(shù)\h9.7泛型和泛型函數(shù)\h9.7.1一個(gè)問(wèn)題的思考\h9.7.2泛型函數(shù)\h9.8本章小結(jié)\h9.9同步練習(xí)\h第10章閉包\h10.1回顧嵌套函數(shù)\h10.2閉包的概念\h10.3使用閉包表達(dá)式\h10.3.1類(lèi)型推斷簡(jiǎn)化\h10.3.2隱藏return關(guān)鍵字\h10.3.3縮寫(xiě)參數(shù)名稱(chēng)\h10.3.4使用閉包返回值\h10.4使用尾隨閉包\h10.5捕獲上下文中的變量和常量\h10.6本章小結(jié)\h10.7同步練習(xí)\h第二部分面向?qū)ο笃猏h第11章Swift語(yǔ)言中的面向?qū)ο筇匦診h11.1面向?qū)ο蟾拍詈突咎卣鱘h11.2Swift中的面向?qū)ο箢?lèi)型\h11.3枚舉\h11.3.1成員值\h11.3.2原始值\h11.3.3相關(guān)值\h11.4結(jié)構(gòu)體與類(lèi)\h11.4.1類(lèi)和結(jié)構(gòu)體定義\h11.4.2再談值類(lèi)型和引用類(lèi)型\h11.4.3引用類(lèi)型的比較\h11.5類(lèi)型嵌套\h11.6可選類(lèi)型與可選鏈\h11.6.1可選類(lèi)型\h11.6.2可選鏈\h11.7訪問(wèn)限定\h11.7.1訪問(wèn)范圍\h11.7.2訪問(wèn)級(jí)別\h11.7.3使用訪問(wèn)級(jí)別最佳實(shí)踐\h11.8本章小結(jié)\h11.9同步練習(xí)\h第12章屬性與下標(biāo)\h12.1存儲(chǔ)屬性\h12.1.1存儲(chǔ)屬性概念\h12.1.2延遲存儲(chǔ)屬性\h12.1.3屬性觀察者\(yùn)h12.2計(jì)算屬性\h12.2.1計(jì)算屬性概念\h12.2.2只讀計(jì)算屬性\h12.2.3結(jié)構(gòu)體和枚舉中的計(jì)算屬性\h12.3屬性觀察者\(yùn)h12.4靜態(tài)屬性\h12.4.1結(jié)構(gòu)體靜態(tài)屬性\h12.4.2枚舉靜態(tài)屬性\h12.4.3類(lèi)靜態(tài)屬性\h12.5使用下標(biāo)\h12.5.1下標(biāo)概念\h12.5.2示例:二維數(shù)組\h12.6本章小結(jié)\h12.7同步練習(xí)\h第13章方法\h13.1實(shí)例方法\h13.1.1使用規(guī)范的命名\h13.1.2結(jié)構(gòu)體和枚舉方法變異\h13.2靜態(tài)方法\h13.2.1結(jié)構(gòu)體中靜態(tài)方法\h13.2.2枚舉中靜態(tài)方法\h13.2.3類(lèi)中靜態(tài)方法\h13.3本章小結(jié)\h13.4同步練習(xí)\h第14章構(gòu)造與析構(gòu)\h14.1構(gòu)造器\h14.1.1默認(rèn)構(gòu)造器\h14.1.2構(gòu)造器與存儲(chǔ)屬性初始化\h14.1.3使用外部參數(shù)名\h14.2構(gòu)造器重載\h14.2.1構(gòu)造器重載概念\h14.2.2值類(lèi)型構(gòu)造器代理\h14.2.3引用類(lèi)型構(gòu)造器橫向代理\h14.3析構(gòu)器\h14.4本章小結(jié)\h14.5同步練習(xí)\h第15章繼承\(zhòng)h15.1從一個(gè)示例開(kāi)始\h15.2構(gòu)造器繼承\(zhòng)h15.2.1構(gòu)造器調(diào)用規(guī)則\h15.2.2構(gòu)造過(guò)程安全檢查\h15.2.3構(gòu)造器繼承\(zhòng)h15.3重寫(xiě)\h15.3.1屬性重寫(xiě)\h15.3.2方法重寫(xiě)\h15.3.3下標(biāo)重寫(xiě)\h15.3.4使用final關(guān)鍵字\h15.4類(lèi)型檢查與轉(zhuǎn)換\h15.4.1使用is操作符\h15.4.2使用as操作符\h15.4.3使用Any和AnyObject類(lèi)型\h15.5本章小結(jié)\h15.6同步練習(xí)\h第16章擴(kuò)展和協(xié)議\h16.1擴(kuò)展\h16.1.1聲明擴(kuò)展\h16.1.2擴(kuò)展計(jì)算屬性\h16.1.3擴(kuò)展方法\h16.1.4擴(kuò)展構(gòu)造器\h16.1.5擴(kuò)展下標(biāo)\h16.2協(xié)議\h16.2.1聲明和遵守協(xié)議\h16.2.2協(xié)議方法\h16.2.3協(xié)議屬性\h16.2.4把協(xié)議作為類(lèi)型使用\h16.2.5協(xié)議的繼承\(zhòng)h16.2.6協(xié)議的合成\h16.3擴(kuò)展中聲明協(xié)議\h16.4本章小結(jié)\h16.5同步練習(xí)\h第17章Swift內(nèi)存管理\h17.1Swift內(nèi)存管理概述\h17.1.1引用計(jì)數(shù)\h17.1.2示例:Swift自動(dòng)引用計(jì)數(shù)\h17.2強(qiáng)引用循環(huán)\h17.3打破強(qiáng)引用循環(huán)\h17.3.1弱引用\h17.3.2無(wú)主引用\h17.4閉包中的強(qiáng)引用循環(huán)\h17.4.1一個(gè)閉包中的強(qiáng)引用循環(huán)示例\h17.4.2解決閉包強(qiáng)引用循環(huán)\h17.5本章小結(jié)\h17.6同步練習(xí)\h第三部分過(guò)渡篇\h第18章從Objective-C到Swift\h18.1選擇語(yǔ)言\h18.2Swift調(diào)用Objective-C\h18.2.1創(chuàng)建Swift的iOS工程\h18.2.2在Swift工程中添加Objective-C類(lèi)\h18.2.3調(diào)用代碼\h18.3Objective-C調(diào)用Swift\h18.3.1創(chuàng)建Objective-C的iOS工程\h18.3.2在Objective-C工程中添加Swift類(lèi)\h18.3.3調(diào)用代碼\h18.4本章小結(jié)\h18.5同步練習(xí)\h第19章使用Foundation框架\h19.1數(shù)字類(lèi)NSNumber\h19.1.1獲得NSNumber實(shí)例\h19.1.2NSNumber對(duì)象的比較\h19.2字符串類(lèi)\h19.2.1NSString類(lèi)\h19.2.2NSMutableString類(lèi)\h19.2.3NSString與String之間的關(guān)系\h19.3數(shù)組類(lèi)\h19.3.1NSArray類(lèi)\h19.3.2NSMutableArray類(lèi)\h19.3.3NSArray與Array之間的關(guān)系\h19.4字典類(lèi)\h19.4.1NSDictionary類(lèi)\h19.4.2NSMutableDictionary類(lèi)\h19.4.3NSDictionary與Dictionary之間的關(guān)系\h19.5本章小結(jié)\h19.6同步練習(xí)\h第四部分實(shí)戰(zhàn)篇\h第20章iOS開(kāi)發(fā)基礎(chǔ)\h20.1iOS介紹\h20.2第一個(gè)iOS應(yīng)用HelloWorld\h20.2.1創(chuàng)建工程\h20.2.2Xcode中的iOS工程模板\h20.2.3程序剖析\h20.3iOSAPI簡(jiǎn)介\h20.4本章小結(jié)\h20.5同步練習(xí)\h第21章項(xiàng)目實(shí)戰(zhàn)——基于分層架構(gòu)的多版本iPhone計(jì)算器\h21.1應(yīng)用分析與設(shè)計(jì)\h21.1.1應(yīng)用概述\h21.1.2需求分析\h21.1.3原型設(shè)計(jì)\h21.1.4分層架構(gòu)設(shè)計(jì)\h21.1.5應(yīng)用設(shè)計(jì)\h21.2創(chuàng)建工程\h21.3業(yè)務(wù)邏輯層開(kāi)發(fā)\h21.3.1創(chuàng)建CalcLogic.swift文件\h21.3.2枚舉類(lèi)型Operator\h21.3.3CalcLogic類(lèi)中屬性\h21.3.4CalcLogic類(lèi)中構(gòu)造器和析構(gòu)器\h21.3.5CalcLogic類(lèi)中更新主標(biāo)簽方法\h21.3.6CalcLogic類(lèi)中判斷是否包含小數(shù)點(diǎn)方法\h21.3.7CalcLogic類(lèi)中計(jì)算方法\h21.3.8CalcLogic類(lèi)中清除方法\h21.4表示層開(kāi)發(fā)\h21.4.1添加圖片資源\h21.4.2改變?cè)O(shè)計(jì)界面大小\h21.4.3添加計(jì)算器背景\h21.4.4在設(shè)計(jì)界面中添加主標(biāo)簽\h21.4.5在設(shè)計(jì)界面中添加按鈕\h21.4.6控件的輸出口和動(dòng)作\h21.4.7視圖控制器\h21.5Objective-C版本的計(jì)算器\h21.5.1Xcode工程文件結(jié)構(gòu)比較\h21.5.2表示層比較\h21.5.3業(yè)務(wù)邏輯層比較\h21.6Swift調(diào)用Objective-C實(shí)現(xiàn)的計(jì)算器\h21.6.1在Swift工程中添加Objective-C類(lèi)\h21.6.2調(diào)用代碼\h21.7Objective-C調(diào)用Swift實(shí)現(xiàn)的計(jì)算器\h21.7.1在Objective-C工程中添加Swift類(lèi)\h21.7.2調(diào)用代碼\h21.8本章小結(jié)\h21.9同步練習(xí)第一部分基礎(chǔ)篇第1章準(zhǔn)備開(kāi)始當(dāng)你拿到這本書(shū)的時(shí)候,我相信你已經(jīng)下定決心開(kāi)始學(xué)習(xí)Swift語(yǔ)言了。那么應(yīng)該怎么開(kāi)始呢?這一章我們不討論技術(shù),而是告訴大家本書(shū)的結(jié)構(gòu)、書(shū)中的一些約定、開(kāi)發(fā)工具,以及如何使用本書(shū)的案例。1.1本書(shū)學(xué)習(xí)路線圖本書(shū)共分為4篇:基礎(chǔ)篇、面向?qū)ο笃⑦^(guò)渡篇和實(shí)戰(zhàn)篇。如圖1-1所示,這是Swift的學(xué)習(xí)路線圖,也是本書(shū)的內(nèi)容結(jié)構(gòu)圖。圖1-1Swift學(xué)習(xí)路線圖1.2本書(shū)中的約定為了方便大家閱讀,本節(jié)會(huì)介紹一下書(shū)中示例代碼和圖示的相關(guān)約定。1.2.1示例代碼約定本書(shū)包含了大量示例代碼,我們可以從圖靈網(wǎng)站本書(shū)主頁(yè)免費(fèi)注冊(cè)下載,或者從智捷教育提供的本書(shū)服務(wù)網(wǎng)站(\h)下載,解壓后會(huì)看到如圖1-2所示的目錄結(jié)構(gòu)。圖1-2源代碼文件目錄其中,ch2~ch21代表第2章到第21章的示例代碼或一些資源文件,其中工程或工作空間的命名有如下幾種形式。二級(jí)目錄標(biāo)號(hào),如“14.3析構(gòu)器”說(shuō)明是14.3節(jié)中使用的“析構(gòu)器”Xcode工程或Playground文件示例。圖標(biāo)為的是Playground文件,圖標(biāo)為的是Xcode工程。三級(jí)目錄標(biāo)號(hào),如“14.1.1默認(rèn)構(gòu)造器”說(shuō)明是14.1.1節(jié)中使用的“默認(rèn)構(gòu)造器”。帶有“~”的情況,如“2.2.2~2.2.3HelloWorld”說(shuō)明是2.2.2節(jié)到2.2.3節(jié)共同使用的HelloWorld工程或Playground文件示例。ch20目錄下只有一個(gè)HelloWorld目錄,沒(méi)有標(biāo)號(hào),說(shuō)明第20章整章都使用HelloWorld這個(gè)示例。1.2.2圖示的約定為了更形象有效地說(shuō)明知識(shí)點(diǎn)或描述操作,本書(shū)添加了很多圖示,下面簡(jiǎn)要說(shuō)明圖示中一些符號(hào)的含義。圖中的圈框。有時(shí)讀者會(huì)看到如圖1-3所示的圈框,框中的內(nèi)容是選中的內(nèi)容或重點(diǎn)說(shuō)明的內(nèi)容。圖1-3圖中圈框圖中的箭頭。如圖1-4所示,實(shí)線箭頭用于說(shuō)明用戶(hù)的動(dòng)作,一般箭尾是動(dòng)作開(kāi)始的地方,箭頭指向動(dòng)作結(jié)束的地方。圖1-5所示的虛線箭頭在書(shū)中用得比較多,常用來(lái)描述設(shè)置控件的屬性等操作。圖1-4圖中實(shí)線箭頭圖1-5圖中虛線箭頭圖中手勢(shì)。為了描述操作,我們?cè)趫D中放置了等手勢(shì)符號(hào),這說(shuō)明點(diǎn)擊了此處的按鈕,如圖1-6所示。圖1-6圖中手勢(shì)1.3Xcode開(kāi)發(fā)工具蘋(píng)果公司于2008年3月6日發(fā)布了iPhone和iPodtouch的應(yīng)用程序開(kāi)發(fā)包,其中包括了Xcode開(kāi)發(fā)工具、iPhoneSDK和iPhone手機(jī)模擬器。第一個(gè)Beta版本是iPhoneSDK1.2b1(build5A147p),發(fā)布后可以立即使用,但是同時(shí)推出的AppStore所需要的固件更新直到2008年7月11日才發(fā)布。編寫(xiě)本書(shū)時(shí),iOSSDK8正式版本已經(jīng)發(fā)布。MacOSX和iOS開(kāi)發(fā)工具主要是Xcode。自從Xcode3.1發(fā)布以后,Xcode就成為iPhone軟件開(kāi)發(fā)工具包的開(kāi)發(fā)環(huán)境。Xcode可以開(kāi)發(fā)MacOSX和iOS應(yīng)用程序,其版本是與SDK相互對(duì)應(yīng)的。例如,Xcode3.2.5與iOSSDK4.2對(duì)應(yīng),Xcode4.1與iOSSDK4.3對(duì)應(yīng),Xcode4.2與iOSSDK5對(duì)應(yīng),Xcode4.5和Xcode4.6與iOSSDK6對(duì)應(yīng),Xcode5與iOSSDK7對(duì)應(yīng),Xcode6與iOSSDK8對(duì)應(yīng)。在Xcode4.1之前,還有一個(gè)配套使用的工具InterfaceBuilder,它是Xcode套件的一部分,用來(lái)設(shè)計(jì)窗體和視圖,通過(guò)它可以“所見(jiàn)即所得”地拖曳控件并定義事件等,其數(shù)據(jù)以XML的形式存儲(chǔ)在xib文件中。在Xcode4.1之后,InterfaceBuilder成為了Xcode的一部分,與Xcode集成在一起。本書(shū)介紹的Swift開(kāi)發(fā)語(yǔ)言使用Xcode6.1工具進(jìn)行學(xué)習(xí)和編寫(xiě),后面在介紹iOS應(yīng)用開(kāi)發(fā)時(shí)也會(huì)使用Xcode。1.3.1Xcode安裝和卸載Xcode必須安裝在MacOSX系統(tǒng)上,Xcode的版本與MacOSX系統(tǒng)版本有著嚴(yán)格的對(duì)應(yīng)關(guān)系,Xcode6要求MacOSX版本在10.9.2以上。安裝可以通過(guò)MacOSX的Dock啟動(dòng)AppStore,如圖1-7所示。如果我們需要安裝軟件或查詢(xún)軟件則需要用戶(hù)登錄,這個(gè)用戶(hù)就是你的AppID,彈出的登錄對(duì)話(huà)框如圖1-8所示。如果你沒(méi)有登錄AppID,可以點(diǎn)擊“創(chuàng)建AppID”按鈕創(chuàng)建。圖1-7應(yīng)用啟動(dòng)AppStore界面圖1-8AppStore用戶(hù)登錄界面之后,我們可以在右上角的搜索欄中輸入要搜索的軟件或工具名稱(chēng)“Xcode”關(guān)鍵字,搜索結(jié)果如圖1-9所示。圖1-9搜索Xcode工具點(diǎn)擊“Xcode”進(jìn)入Xcode信息介紹界面,如圖1-10所示,點(diǎn)擊“Install”按鈕開(kāi)始安裝。圖1-10Xcode安裝提示如果想使用測(cè)試版本的Xcode,不能通過(guò)AppStore下載和安裝,AppStore所能下載的都是正式發(fā)布版本,測(cè)試版本的Xcode只有蘋(píng)果開(kāi)發(fā)者通過(guò)開(kāi)發(fā)者賬號(hào)才能下載。圖1-11所示是Xcode測(cè)試版下載頁(yè)面。如果沒(méi)有開(kāi)發(fā)者賬號(hào),大家可以到本書(shū)網(wǎng)站(\h)下載。圖1-11Xcode測(cè)試版下載頁(yè)面卸載Xcode非常簡(jiǎn)單,事實(shí)上只需要在MacOSX應(yīng)用程序中直接刪除就可以了。如圖1-12所示,打開(kāi)應(yīng)用程序,右鍵選擇“Xcode”彈出菜單,選擇“移到廢紙簍”刪除Xcode應(yīng)用。如果想徹底刪除,只需清空廢紙簍就可以了。圖1-12Xcode卸載1.3.2Xcode界面打開(kāi)Xcode6工具,看到的主界面如圖1-13所示。該界面主要分成3個(gè)區(qū)域,①號(hào)區(qū)域是工具欄,其中的按鈕可以完成大部分工作。②號(hào)區(qū)域是導(dǎo)航欄,主要是對(duì)工作空間中的內(nèi)容進(jìn)行導(dǎo)航。③號(hào)區(qū)域是代碼編輯區(qū),我們的編碼工作就是在這里完成的。在導(dǎo)航欄上面還有一排按鈕,如圖1-14所示,默認(rèn)選中的是“文件”導(dǎo)航面板。關(guān)于各個(gè)按鈕的具體用法,我們會(huì)在以后用到的時(shí)候詳細(xì)介紹。圖1-13Xcode主界面圖1-14Xcode導(dǎo)航面板在選中導(dǎo)航面板時(shí),導(dǎo)航欄下面也有一排按鈕,如圖1-15所示。這是輔助按鈕,它們的功能都與該導(dǎo)航面板內(nèi)容相關(guān)。對(duì)于不同的導(dǎo)航面板,這些按鈕也是不同的。圖1-15導(dǎo)航面板的輔助按鈕此外,學(xué)習(xí)Swift還可以使用Playground進(jìn)行編寫(xiě)和運(yùn)行,它也是Xcode6開(kāi)發(fā)工具之一,我們將在第2章介紹。1.4如何使用API幫助對(duì)于初學(xué)者來(lái)說(shuō),學(xué)會(huì)在Xcode中使用API幫助文檔是非常重要的。下面我們通過(guò)一個(gè)例子來(lái)介紹API幫助文檔的用法。在編寫(xiě)HelloWorld程序時(shí),可以看到ViewController.swift的代碼,具體如下所示:importUIKit
classViewController:UIViewController{
overridefuncviewDidLoad(){
super.viewDidLoad()
//Doanyadditionalsetupafterloadingtheview,typicallyfromanib.
}
overridefuncdidReceiveMemoryWarning(){
super.didReceiveMemoryWarning()
//Disposeofanyresourcesthatcanberecreated.
}
}
如果我們對(duì)于didReceiveMemoryWarning方法感到困惑,就可以查找?guī)椭臋n。如果只是簡(jiǎn)單查看幫助信息,可以選中該方法,然后選擇右邊的快捷幫助檢查器,如圖1-16所示。圖1-16Xcode快捷幫助檢查器在打開(kāi)的Xcode快捷幫助檢查器窗口中,可以看到該方法的描述,其中包括使用的iOS版本、相關(guān)主題以及一些相關(guān)示例。這里需要說(shuō)明的是,如果需要查看官方的示例,直接從這里下載即可。如果想查詢(xún)比較完整的、全面的幫助文檔,可以按住Alt鍵雙擊didReceiveMemoryWarning方法名,這樣就會(huì)打開(kāi)一個(gè)XcodeAPI幫助搜索結(jié)果窗口,如圖1-17所示。然后選擇感興趣的主題,進(jìn)入API幫助界面,如圖1-18所示。圖1-17XcodeAPI幫助搜索結(jié)果窗口圖1-18XcodeAPI幫助界面API幫助文檔還提供給我們一些官方示例,在左邊的導(dǎo)航面板中可以找到相關(guān)的SampleCode,如圖1-19所示。單擊展開(kāi)“SampleCode”找到相關(guān)示例工程并單擊,在右邊內(nèi)容窗口中可以看到關(guān)于該示例的描述,如果單擊“OpenProject”按鈕,就可以打開(kāi)并下載這個(gè)示例工程。圖1-19官方案例1.5本章小結(jié)通過(guò)對(duì)本章內(nèi)容的學(xué)習(xí),我們可以了解到本書(shū)的學(xué)習(xí)路線圖,熟悉本書(shū)中的一些約定,便于對(duì)本書(shū)的學(xué)習(xí),還可以掌握Xcode開(kāi)發(fā)工具的安裝和卸載,并熟練使用API文檔。1.6同步練習(xí)1.介紹說(shuō)明Xcode界面中各個(gè)區(qū)域的作用。2.請(qǐng)使用Xcode中的API幫助文檔,找UIViewController關(guān)鍵字的相關(guān)幫助信息。第2章第一個(gè)Swift程序從控制臺(tái)輸出“HelloWorld”是我學(xué)習(xí)C語(yǔ)言的第一步,也是我人生中非常重要的一步。多年后的今天,我仍希望以HelloWorld作為第一步,與大家共同開(kāi)啟一個(gè)神奇、瑰麗的世界——Swift編程。本章以HelloWorld作為切入點(diǎn),向大家系統(tǒng)介紹如何使用Xcode的Playground編寫(xiě)和運(yùn)行Swift程序代碼。2.1使用Playground編寫(xiě)編寫(xiě)和運(yùn)行Swift程序有多種方式,我們可以通過(guò)在Xcode中創(chuàng)建一個(gè)iOS或MacOSX工程來(lái)實(shí)現(xiàn),也可以通過(guò)使用Xcode6提供的Playground來(lái)實(shí)現(xiàn)。在學(xué)習(xí)階段,我推薦大家使用Playground工具編寫(xiě)和運(yùn)行Swift程序。2.1.1編程利器PlaygroundPlayground離不開(kāi)Xcode6,它是蘋(píng)果在Xcde6中添加的新功能。使用Xcode創(chuàng)建工程編寫(xiě)和運(yùn)行程序,目的是為了使最終的程序編譯和發(fā)布,而使用Playground的目的是為了學(xué)習(xí)、測(cè)試算法、驗(yàn)證想法和可視化地看到運(yùn)行結(jié)果。圖2-1所示是一個(gè)Playground程序運(yùn)行界面,其中①區(qū)域是代碼編寫(xiě)區(qū)域,②區(qū)域是運(yùn)行結(jié)果區(qū)域,③區(qū)域是時(shí)間軸(timeline)區(qū)域。時(shí)間軸可以查看程序從上到下按照時(shí)間運(yùn)行的結(jié)果,不同時(shí)間階段運(yùn)行的結(jié)果可以通過(guò)文本、圖形和曲線圖表等方式展示給開(kāi)發(fā)人員。圖2-1Playground界面2.1.2編寫(xiě)HelloWorld程序下面我們具體介紹如何使用Playground編寫(xiě)HelloWorld程序。首先,打開(kāi)Xcode6的歡迎界面(如圖2-2所示)。一般第一次啟動(dòng)Xcode6就可以看到這個(gè)界面,如果沒(méi)有,可以通過(guò)菜單Windows→WelcometoXcode打開(kāi)。圖2-2Xcode6歡迎界面在圖2-2所示的歡迎界面中,單擊“Getstartedwithaplayground”彈出如圖2-3所示的對(duì)話(huà)框,在Name中輸入文件名“MyPlayground”,這是我們要保存的文件名,在Platform中選擇“iOS”,然后單擊“Next”按鈕,彈出圖2-4所示的界面,保存文件對(duì)話(huà)框。完成之后可以單擊“Create”按鈕創(chuàng)建Playground,創(chuàng)建成功后界面如圖2-5所示。圖2-3輸入文件名圖2-4選擇保存文件目錄圖2-5新建Playground界面我們?cè)趫D2-5所示的界面就可以編輯了,其中模板已經(jīng)生成了一些代碼,修改代碼如下:importUIKit
varstr="HelloWorld"
println(str)
代碼修改完成后,馬上就會(huì)編譯運(yùn)行,但是我們?cè)谟疫呏荒芸吹絪tr變量情況,不能看到println輸出結(jié)果,如圖2-6所示。此時(shí)可以單擊“HelloWorld”后面的“ValueHistory”按鈕,打開(kāi)時(shí)間軸,如圖2-7所示。圖2-6修改后的Playground界面圖2-7打開(kāi)Playground時(shí)間軸界面從圖2-7所示的時(shí)間軸可以看到輸出的結(jié)果。其中,ConsoleOutput是println函數(shù)的輸出結(jié)果。我們還可以通過(guò)助手編輯器打開(kāi)Playground時(shí)間軸界面,具體操作過(guò)程如圖2-8所示。右鍵單擊標(biāo)題欄,在菜單中選中“IconandText”,然后在出現(xiàn)的工具欄中,單擊打開(kāi)助手編輯器。在助手編輯器中也有時(shí)間軸界面。圖2-8通過(guò)助手編輯器打開(kāi)Playground時(shí)間軸界面2.2代碼解釋Swift實(shí)現(xiàn)HelloWorld的方式比C和Objective-C等語(yǔ)言的實(shí)現(xiàn)要簡(jiǎn)單得多,下面我們?cè)敿?xì)解釋一下代碼。1.importUIKit語(yǔ)句importUIKit表示引入U(xiǎn)IKit框架,類(lèi)似于Objective-C中的#import和C中的#include。至于后面引入何種UIKit框架,就需要我們查找API來(lái)確定了。就本例而言,我們根本不需要UIKit框架,不過(guò)導(dǎo)入也沒(méi)關(guān)系。2.varstr="HelloWorld"聲明str變量,var表示聲明變量。在var中并不能看出變量是什么類(lèi)型,但Swift可以通過(guò)賦值的類(lèi)型推斷出變量的類(lèi)型。由于我們賦值的是"HelloWorld"字符串,因此可知str是字符串變量。我們還應(yīng)該注意到語(yǔ)句結(jié)束時(shí)沒(méi)有出現(xiàn)像C和Objective-C等語(yǔ)言結(jié)束時(shí)的分號(hào)(;)。3.println(str)println是一個(gè)函數(shù),能夠?qū)⒆兞炕蛄枯敵龅娇刂婆_(tái),類(lèi)似于C中的println函數(shù)和Objective-C中的NSLog函數(shù)。有關(guān)格式化輸出的問(wèn)題我們會(huì)在后面再介紹。這樣我們通過(guò)短短的3行代碼實(shí)現(xiàn)了一個(gè)HelloWorld輸出的功能,事實(shí)上我們還可以寫(xiě)得更少。2.3本章小結(jié)通過(guò)對(duì)本章內(nèi)容的學(xué)習(xí),我們可以了解到如何使用Xcode的Playground編寫(xiě)和運(yùn)行Swift程序代碼,了解Swift的程序結(jié)構(gòu),并熟悉Playground工具的使用。2.4同步練習(xí)1.介紹說(shuō)明Playground界面中各個(gè)區(qū)域的作用。2.請(qǐng)使用Xcode的Playground編寫(xiě)一個(gè)輸出HelloSwift字符串的Swift程序,并解釋代碼的含義。第3章Swift基本語(yǔ)法本章主要為大家介紹Swift的一些基本語(yǔ)法,其中包括標(biāo)識(shí)符和關(guān)鍵字、常量、變量、表達(dá)式和注釋等內(nèi)容。3.1標(biāo)識(shí)符和關(guān)鍵字任何一種計(jì)算機(jī)語(yǔ)言都離不開(kāi)標(biāo)識(shí)符和關(guān)鍵字,下面我們將詳細(xì)介紹Swift標(biāo)識(shí)符和關(guān)鍵字。3.1.1標(biāo)識(shí)符標(biāo)識(shí)符就是給變量、常量、方法、函數(shù)、枚舉、結(jié)構(gòu)體、類(lèi)、協(xié)議等指定的名字。構(gòu)成標(biāo)識(shí)符的字母均有一定的規(guī)范,Swift語(yǔ)言中標(biāo)識(shí)符的命名規(guī)則如下:區(qū)分大小寫(xiě),Myname與myname是兩個(gè)不同的標(biāo)識(shí)符;標(biāo)識(shí)符首字符可以以下劃線(_)或者字母開(kāi)始,但不能是數(shù)字;標(biāo)識(shí)符中其他字符可以是下劃線(_)、字母或數(shù)字。例如,identifier、userName、User_Name、_sys_val、身高等為合法的標(biāo)識(shí)符,而2mail、room#和class為非法的標(biāo)識(shí)符。其中,使用中文“身高”命名的變量是合法的。注意Swift中的字母采用的是Unicode編碼1。Unicode叫做統(tǒng)一編碼制,它包含了亞洲文字編碼,如中文、日文、韓文等字符,甚至是我們?cè)诹奶旃ぞ咧惺褂玫谋砬榉?hào),如等,這些符號(hào)事實(shí)上也是Unicode,而非圖片。這些符號(hào)在Swift中都可以使用。1Unicode是國(guó)際組織制定的可以容納世界上所有文字和符號(hào)的字符編碼方案。Unicode用數(shù)字0-0x10FFFF來(lái)映射這些字符,最多可以容納1114112個(gè)字符,或者說(shuō)有1114112個(gè)碼位?!俣劝倏芢h/view/2602518.htm如果一定要使用關(guān)鍵字作為標(biāo)識(shí)符,可以在關(guān)鍵字前后添加重音符號(hào)(`),例如:其中class是關(guān)鍵字,事實(shí)上重音符號(hào)(`)不是標(biāo)識(shí)符的一部分,它也可以用于其他標(biāo)識(shí)符,如π和`π`是等價(jià)的。因此使用關(guān)鍵字作為標(biāo)識(shí)符是一種很不好的編程習(xí)慣。3.1.2關(guān)鍵字關(guān)鍵字是類(lèi)似于標(biāo)識(shí)符的保留字符序列,除非用重音符號(hào)(`)將其括起來(lái),否則不能用作標(biāo)識(shí)符。關(guān)鍵字是對(duì)編譯器具有特殊意義的預(yù)定義保留標(biāo)識(shí)符。常見(jiàn)的關(guān)鍵字有以下4種。與聲明有關(guān)的關(guān)鍵字:class、deinit、enum、extension、func、import、init、let、protocol、static、struct、subscript、typealias和var。與語(yǔ)句有關(guān)的關(guān)鍵字:break、case、continue、default、do、else、fallthrough、if、in、for、return、switch、where和while。表達(dá)式和類(lèi)型關(guān)鍵字:as、dynamicType、is、new、super、self、Self、Type、__COLUMN__、__FILE__、__FUNCTION__和__LINE__。在特定上下文中使用的關(guān)鍵字:associativity、didSet、get、infix、inout、left、mutating、none、nonmutating、operator、override、postfix、precedence、prefix、rightset、unowned、unowned(safe)、unowned(unsafe)、weak和willSet。對(duì)于上述關(guān)鍵字,目前我們沒(méi)有必要全部知道它們的含義,但是要記?。涸赟wift中,關(guān)鍵字是區(qū)分大小寫(xiě)的,因此class和Class是不同的,當(dāng)然Class不是Swift的關(guān)鍵字。3.2常量和變量我們?cè)谏弦徽轮薪榻B了如何使用Swift編寫(xiě)一個(gè)HelloWorld小程序,其中就用到了變量。常量和變量是構(gòu)成表達(dá)式的重要組成部分。3.2.1常量在聲明和初始化變量時(shí),在標(biāo)識(shí)符的前面加上關(guān)鍵字let,就可以把該變量指定為一個(gè)常量。顧名思義,常量是其值在使用過(guò)程中不會(huì)發(fā)生變化的量,實(shí)例代碼如下:let_Hello="Hello"
_Hello標(biāo)識(shí)符就是常量,只能在初始化的時(shí)候被賦值,如果我們?cè)俅谓o_Hello賦值,代碼如下:_Hello="Hello,World"
則程序會(huì)報(bào)錯(cuò),如圖3-1所示,時(shí)間軸中顯示了錯(cuò)誤信息。圖3-1時(shí)間軸中錯(cuò)誤信息從錯(cuò)誤信息可以獲知_Hello是let分配的值,不能被賦值。3.2.2變量在Swift中聲明變量,就是在標(biāo)識(shí)符的前面加上關(guān)鍵字var,實(shí)例代碼如下:varscoreForStudent=0.0
該語(yǔ)句聲明Double類(lèi)型scoreForStudent變量,并且初始化為0.0。如果在一個(gè)語(yǔ)句中聲明和初始化了多個(gè)變量,那么所有的變量都具有相同的數(shù)據(jù)類(lèi)型:varx=10,y=20
在多個(gè)變量的聲明中,我們也能指定不同的數(shù)據(jù)類(lèi)型:varx=10,y=true
其中x為整型,y為布爾型。3.2.3命名規(guī)范在使用常量和變量的時(shí)候,要保證它們的命名符合規(guī)范,這樣程序才具有良好的可讀性。這也是一種良好的編程習(xí)慣。1.常量名基本數(shù)據(jù)類(lèi)型的常量名全為大寫(xiě),如果由多個(gè)單詞構(gòu)成,則可以用下劃線隔開(kāi),例如:letYEAR=60
letWEEK_OF_MONTH=3
2.變量名變量的命名有多種風(fēng)格,主要以清楚易懂為主。有些程序員為了方便,使用單個(gè)字母來(lái)作為變量名稱(chēng),如j和i等,這會(huì)為日后程序維護(hù)帶來(lái)困難,變量同名的概率也會(huì)增加。單個(gè)字母變量一般只用于循環(huán)變量,因?yàn)樗鼈冎蛔饔糜谘h(huán)體內(nèi)。在過(guò)去,計(jì)算機(jī)語(yǔ)言對(duì)變量名稱(chēng)的長(zhǎng)度會(huì)有所限制,但現(xiàn)在已經(jīng)沒(méi)有這種限制了,因此我們鼓勵(lì)用清楚的名稱(chēng)來(lái)表明變量的作用,通常會(huì)以小寫(xiě)字母作為開(kāi)始,其余單詞首字母大寫(xiě),例如:varmaximumNumberOfLoginAttempts=10
varcurrentLoginAttempt=0
這樣的名稱(chēng)可以令變量的作用一目了然。除了常量和變量的命名要規(guī)范之外,其他語(yǔ)言對(duì)象的命名也要規(guī)范。其中類(lèi)名、協(xié)議名、結(jié)構(gòu)體、枚舉等類(lèi)型的命名規(guī)范通常是,大寫(xiě)字母作為開(kāi)始,其余單詞首字母大寫(xiě),例如類(lèi)名HelloWorldApp。函數(shù)和方法名往往由多個(gè)單詞合成,第一個(gè)單詞通常為動(dòng)詞,以小寫(xiě)字母作為開(kāi)始,其余單詞首字母大寫(xiě),例如balanceAccount和isButtonPressed。3.3注釋Swift程序有兩類(lèi)注釋?zhuān)簡(jiǎn)涡凶⑨專(zhuān)?/)和多行注釋?zhuān)?*...*/)。注釋方法與C、C++和Objective-C語(yǔ)言都是類(lèi)似的,下面詳細(xì)介紹一下。1.單行注釋單行注釋可以注釋整行或者一行中的一部分,一般不用于連續(xù)多行的注釋文本。當(dāng)然,它也可以用來(lái)注釋連續(xù)多行的代碼段。以下是兩種注釋風(fēng)格的例子:ifx>1{
//注釋1
}else{
returnfalse//注釋2
}
//ifx>1{
////注釋1
//}else{
//returnfalse//注釋2
//}
提示在Xcode中對(duì)連續(xù)多行的注釋文本可以使用快捷鍵:選擇多行然后按住“command+/”鍵進(jìn)行注釋。去掉注釋也是按住“command+/”鍵。2.塊注釋一般用于連續(xù)多行的注釋文本,但也可以對(duì)單行進(jìn)行注釋。以下是幾種注釋風(fēng)格的例子:ifx>1{
/*注釋1*/
}else{
returnfalse/*注釋2*/
}
/*
ifx>1{
//注釋1
}else{
returnfalse//注釋2
}
*/
/*
ifx>1{
/*注釋1*/
}else{
returnfalse/*注釋2*/
}
*/
提示Swift多行注釋有一個(gè)其他語(yǔ)言沒(méi)有的優(yōu)點(diǎn),就是可以嵌套,上述示例的最后一種情況便實(shí)現(xiàn)了多行注釋嵌套。在程序代碼中,對(duì)容易引起誤解的代碼進(jìn)行注釋是必要的,但應(yīng)避免對(duì)已清晰表達(dá)信息的代碼進(jìn)行注釋。需要注意的是,頻繁的注釋有時(shí)反映了代碼的低質(zhì)量。當(dāng)你覺(jué)得被迫要加注釋的時(shí)候,不妨考慮一下重寫(xiě)代碼使其更清晰。3.4表達(dá)式表達(dá)式是程序代碼的重要組成部分,在Swift中,表達(dá)式有3種形式。1.不指定數(shù)據(jù)類(lèi)型vara1=10
leta2=20
vara=a1>a2?"a1":"a2"
在上述代碼中,我們直接為變量或常量賦值,并沒(méi)有指定數(shù)據(jù)類(lèi)型,因?yàn)樵赟wift中可以自動(dòng)推斷數(shù)據(jù)類(lèi)型。2.指定數(shù)據(jù)類(lèi)型vara1:Int=10
leta2:Int=20
vara=a1>a2?"a1":"a2"
在上述代碼中,:Int是為變量和常量指定數(shù)據(jù)類(lèi)型。這種寫(xiě)法使程序可讀性良好,我們推薦明確指定變量和常量的數(shù)據(jù)類(lèi)型。3.使用分號(hào)vara1:Int=10;vara2:Int=20
vara=a1>a2?"a1":"a2"
在Swift語(yǔ)言中,一條語(yǔ)句結(jié)束后可以不加分號(hào)也可以添加分號(hào),但是有一種情況必須要用分號(hào),那就是多條語(yǔ)句寫(xiě)在一行的時(shí)候,需要通過(guò)分號(hào)來(lái)區(qū)別語(yǔ)句。例如:vara1:Int=10;vara2:Int=20;
3.5本章小結(jié)通過(guò)對(duì)本章內(nèi)容的學(xué)習(xí),我們可以了解到Swift語(yǔ)言的基本語(yǔ)法,其中包括標(biāo)識(shí)符和關(guān)鍵字、常量、變量、表達(dá)式和注釋等內(nèi)容。3.6同步練習(xí)1.下列是Swift合法標(biāo)識(shí)符的是()。A.2variableB.variable2C._whatavariableD._3_E.$anothervarF.#myvarG.體重H.I.class2.下列不是Swift關(guān)鍵字的是()。A.ifB.thenC.gotoD.whileE.caseF.__COLUMN__G.whereH.Class3.描述下列代碼的運(yùn)行結(jié)果。let_Hello1="Hello"①
_Hello1="Hello,World"②
println(_Hello1)③
var_Hello2="Hello"④
_Hello2="Hello,World"⑤
println(_Hello2)⑥
4.下列有關(guān)Swift注釋使用正確的是()。A.ifx>1{
//注釋1
}else{
returnfalse//注釋2
}
B.//let_Hello1="Hello"
//_Hello1="Hello,World"
//println(_Hello1)
C./*
let_Hello1="Hello"
_Hello1="Hello,World"
println(_Hello1)
*/
D./**
let_Hello1="Hello"
_Hello1="Hello,World"
println(_Hello1)
*/
5.下列表達(dá)式不正確的是()。A.varn1:Int=10;B.varn1:Int=10C.varn1=10D.varn1:Int=10;varstr:String=20E.varn1:Int=10;varstr:String="20"F.varn1:Int=10;varstr:String='20'第4章基本運(yùn)算符本章主要為大家介紹一些Swift語(yǔ)言的基本運(yùn)算符,包括算術(shù)運(yùn)算符、關(guān)系運(yùn)算符、邏輯運(yùn)算符、位運(yùn)算符和其他運(yùn)算符。4.1算術(shù)運(yùn)算符Swift中的算術(shù)運(yùn)算符用來(lái)組織整型和浮點(diǎn)型數(shù)據(jù)的算術(shù)運(yùn)算,按照參加運(yùn)算的操作數(shù)的不同可以分為一元運(yùn)算符和二元運(yùn)算符。4.1.1一元運(yùn)算符算術(shù)一元運(yùn)算一共有3個(gè),分別是-、++和--。-a是對(duì)a取反運(yùn)算,a++或a--是在表達(dá)式運(yùn)算完后,再給a加一或減一。而++a或--a是先給a加一或減一,然后再進(jìn)行表達(dá)式運(yùn)算。具體說(shuō)明參見(jiàn)表4-1。表4-1一元算術(shù)運(yùn)算運(yùn)算符名稱(chēng)說(shuō)明例子-取反符號(hào)取反運(yùn)算b=-a++自加一先取值再加一,或先加一再取值a++或++a--自減一先取值再減一,或先減一再取值a--或--a下面我們來(lái)看一個(gè)一元算數(shù)運(yùn)算符的示例:vara=12
println(-a)①
varb=a++②
println(b)
b=++a③
println(b)
輸出結(jié)果如下:-12
12
14
上述代碼第①行是-a,是把a(bǔ)變量取反,結(jié)果輸出是-12。第②行代碼是把a(bǔ)++賦值給b變量,先賦值后++,因此輸出結(jié)果是12。第③行代碼是把++a賦值給b變量,先++后賦值,因此輸出結(jié)果是14。4.1.2二元運(yùn)算符二元運(yùn)算符包括:+、-、*、/和%,這些運(yùn)算符對(duì)整型和浮點(diǎn)型數(shù)據(jù)都有效,具體說(shuō)明參見(jiàn)表4-2。表4-2二元算術(shù)運(yùn)算運(yùn)算符名稱(chēng)說(shuō)明例子+加求a加b的和,還可用于String類(lèi)型,進(jìn)行字符串連接操作a+b-減求a減b的差a-b*乘求a乘以b的積a*b/除求a除以b的商a/b%取余求a除以b的余數(shù)a%b下面我們來(lái)看一個(gè)二元算數(shù)運(yùn)算符的示例://聲明一個(gè)整型變量
varintResult=1+2
println(intResult)
intResult=intResult-1
println(intResult)
intResult=intResult*2
println(intResult)
intResult=intResult/2
println(intResult)
intResult=intResult+8
intResult=intResult%7
println(intResult)
println("-------")
//聲明一個(gè)浮點(diǎn)型變量
vardoubleResult=10.0
println(doubleResult)
doubleResult=doubleResult-1
println(doubleResult)
doubleResult=doubleResult*2
println(doubleResult)
doubleResult=doubleResult/2
println(doubleResult)
doubleResult=doubleResult+8
doubleResult=doubleResult%7
println(doubleResult)
輸出結(jié)果如下:3
2
4
2
3
-------
10.0
9.0
18.0
9.0
3.0
上述例子中分別對(duì)整型和浮點(diǎn)型進(jìn)行了二元運(yùn)算,具體語(yǔ)句不再贅述。4.1.3算術(shù)賦值運(yùn)算符算術(shù)賦值運(yùn)算符只是一種簡(jiǎn)寫(xiě),一般用于變量自身的變化,具體說(shuō)明參見(jiàn)表4-3。表4-3算術(shù)賦值符運(yùn)算符名稱(chēng)例子+=加賦值a+=b,a+=b+3-=減賦值a-=b*=乘賦值a*=b/=除賦值a/=b%=取余賦值a%=b下面我們來(lái)看一個(gè)算術(shù)賦值運(yùn)算符的示例:vara=1
varb=2
a+=b//相當(dāng)于a=a+b
println(a)
a+=b+3//相當(dāng)于a=a+b+3
println(a)
a-=b//相當(dāng)于a=a-b
println(a)
a*=b//相當(dāng)于a=a*b
println(a)
a/=b//相當(dāng)于a=a/b
println(a)
a%=b//相當(dāng)于a=a%b
println(a)
輸出結(jié)果如下:3
8
6
12
6
0
上述例子中分別對(duì)整型進(jìn)行了+=、-=、*=、/=和%=運(yùn)算,具體語(yǔ)句不再贅述。4.2關(guān)系運(yùn)算符關(guān)系運(yùn)算是比較兩個(gè)表達(dá)式大小關(guān)系的運(yùn)算,它的結(jié)果是true或false,即布爾型數(shù)據(jù)。如果表達(dá)式成立則結(jié)果為true,否則為false。關(guān)系運(yùn)算符有8種:==、!=、>、<、>=、<=、===和!==,具體說(shuō)明參見(jiàn)表4-4。表4-4關(guān)系運(yùn)算符運(yùn)算符名稱(chēng)說(shuō)明例子可應(yīng)用的類(lèi)型==等于a等于b時(shí)返回true,否則false。==與=的含義不同a==b整型,浮點(diǎn)型,字符型串,布爾型等值類(lèi)型比較!=不等于與==恰恰相反a!=b整型,浮點(diǎn)型,字符型串,布爾型等值類(lèi)型比較>大于a大于b時(shí)返回true,否則falsea>b整型,浮點(diǎn)型,字符型串<小于a小于b時(shí)返回true,否則falsea<b整型,浮點(diǎn)型,字符型串>=大于等于a大于等于b時(shí)返回true,否則falsea>=b整型,浮點(diǎn)型,字符型串<=小于等于a小于等于b時(shí)返回true,否則falsea<=b整型,浮點(diǎn)型,字符型串===恒等于a與b同引用同一個(gè)實(shí)例時(shí)返回true,否則false。===與==的含義不同。==是比較兩個(gè)引用的內(nèi)容是否是同一個(gè)實(shí)例a===b主要用于引用數(shù)據(jù)比較!==不恒等于與===恰恰相反a!==b主要用于引用數(shù)據(jù)比較下面我們來(lái)看一個(gè)關(guān)系運(yùn)算符的示例:varvalue1=1
varvalue2=2
ifvalue1==value2{
println("value1==value2")
}
ifvalue1!=value2{
println("value1!=value2")
}
ifvalue1>value2{
println("value1>value2")
}
ifvalue1<value2{
println("value1<value2")
}
ifvalue1<=value2{
println("value1<=value2")
}
letname1="world"
letname2="world"
ifname1==name2{①
println("name1==name2")
}
leta1=[1,2]//數(shù)組類(lèi)型常量
leta2=[1,2]//數(shù)組類(lèi)型常量
ifa1==a2{②
println("a1==a2")
}
ifa1===a2{③
println("a1===a2")
}
輸出結(jié)果如下:value1!=value2
value1<value2
value1<=value2
name1==name2
a1==a2
上述例子中,第①行是比較兩個(gè)字符串內(nèi)容是否相等,注意字符串String類(lèi)型不能使用===進(jìn)行比較,因?yàn)镾tring不是引用類(lèi)型。第②行代碼是比較兩個(gè)數(shù)組內(nèi)容是否相等,我們會(huì)發(fā)現(xiàn)結(jié)果是相等的。第③行代碼是比較兩個(gè)數(shù)組是否相等(即是否是同一個(gè)實(shí)例),我們會(huì)發(fā)現(xiàn)結(jié)果是不相等的。提示===和!==一般不用于引用類(lèi)型之外的其他類(lèi)型的比較。由于Swift中引用類(lèi)型只有類(lèi),所以===和!==一般只比較類(lèi)的實(shí)例,而結(jié)構(gòu)體不是引用類(lèi)型,一般不能比較,但是Array(數(shù)組)結(jié)構(gòu)體是例外的一個(gè),它雖然是結(jié)構(gòu)體,但它可以使用===和!==進(jìn)行比較。所以上述代碼第③行并不會(huì)有編譯錯(cuò)誤,如果我們將第②行代碼改為===進(jìn)行比較,則會(huì)發(fā)生編譯錯(cuò)誤。4.3邏輯運(yùn)算符邏輯運(yùn)算符是對(duì)布爾型變量進(jìn)行運(yùn)算,其結(jié)果也是布爾型,具體說(shuō)明參見(jiàn)表4-5。表4-5關(guān)系運(yùn)算符運(yùn)算符名稱(chēng)例子說(shuō)明可應(yīng)用的類(lèi)型!邏輯反!aa為true時(shí),值為false,a為false時(shí),值為true布爾型&&短路與a&&bab全為true時(shí),計(jì)算結(jié)果為true,否則為false布爾型||短路或a||bab全為false時(shí),計(jì)算結(jié)果為false,否則為true布爾型&&和||都具有短路計(jì)算的特點(diǎn)。例如x&&y,如果x為false,則不計(jì)算y(因?yàn)椴徽搚為何值,“與”操作的結(jié)果都為false)。而對(duì)于x||y,如果x為true,則不計(jì)算y(因?yàn)椴徽搚為何值,“或”操作的結(jié)果都為true)。所以,我們把&&稱(chēng)為“短路與”、把||稱(chēng)為“短路或”的原因就是,它們?cè)谟?jì)算過(guò)程中就像電路短路一樣采用最優(yōu)化的計(jì)算方式,從而提高了效率。為了進(jìn)一步理解它們的區(qū)別,我們看看下面的例子:vari=0
vara=10
varb=9
if(a>b)||(i++==1){//換成|試一下①
println("或運(yùn)算為true")②
}else{
println("或運(yùn)算為false")③
}
println("i=\(i)")④
i=0;
if(a<b)&&(i++==1){//換成&試一下⑤
println("與運(yùn)算為true")⑥
}else{
println("與運(yùn)算為false")⑦
}
println("i=\(i)")⑧
上述代碼運(yùn)行輸出結(jié)果如下:或運(yùn)算為true
i=0
與運(yùn)算為false
i=0
其中,第①行代碼是進(jìn)行短路或計(jì)算,由于(a>b)是true,后面的表達(dá)式(i++==1)不再計(jì)算,因此結(jié)果i不會(huì)加一,第④行輸出的結(jié)果為i=0。如果我們把第①行短路或換成邏輯或,結(jié)果則是i=1。類(lèi)似地,第⑤行代碼是進(jìn)行短路與計(jì)算,由于(a<b)是false,后面的表達(dá)式(i++==1)不再計(jì)算,因此結(jié)果i不會(huì)加一,第⑧行輸出的結(jié)果為i=0。如果我們把第⑤行短路與換成邏輯與,結(jié)果則是i=1。4.4位運(yùn)算符位運(yùn)算是以二進(jìn)位(bit)為單位進(jìn)行運(yùn)算的,操作數(shù)和結(jié)果都是整型數(shù)據(jù)。位運(yùn)算符有如下幾個(gè)運(yùn)算符:&,|,^,~,>>,<<,具體說(shuō)明參見(jiàn)表4-6。表4-6位運(yùn)算符運(yùn)算符名稱(chēng)例子說(shuō)明~位反~x將x的值按位取反&位與x&yx與y位進(jìn)行位與運(yùn)算|位或x|yx與y位進(jìn)行位或運(yùn)算^位異或x^yx與y位進(jìn)行位異或運(yùn)算>>右移x>>ax右移a位,無(wú)符號(hào)整數(shù)高位采用0補(bǔ)位,有符號(hào)整數(shù)高位采用符號(hào)位補(bǔ)位<<左移x<<ax左移a位,低位位補(bǔ)0為了進(jìn)一步理解它們,我們看看下面的例子:leta:UInt8=0b10110010①
letb:UInt8=0b01011110②
println("a|b=\(a|b)")//11111110③
println("a&b=\(a&b)")//00010010④
println("a^b=\(a^b)")//11101100⑤
println("~a=\(~a)")//01001101⑥
println("a>>2=\(a>>2)")//00101100⑦
println("a<<2=\(a<<2)")//11001000⑧
letc:Int8=-0b1100⑨
println("c>>2=\(c>>2)")//-00000011⑩
println("c<<2=\(c<<2)")//-00110000?
輸出結(jié)果如下:a|b=254
a&b=18
a^b=236
~a=77
a>>2=44
a<<2=200
c>>2=-3
c<<2=-48
上述代碼中,我們?cè)诘冖傩泻偷冖谛蟹謩e定義了UInt8(無(wú)符號(hào)8位整數(shù))變量a和b,0b01011110表示二進(jìn)制整數(shù),前面的0b前綴表示二進(jìn)制。在第⑨行定義了c為Int8(有符號(hào)8位整數(shù)),它右位移的時(shí)候,高位使用符號(hào)位占位的。注意輸出結(jié)果是十進(jìn)制的。代碼第③行println("a|b=\(a|b)")是進(jìn)行位或運(yùn)算,結(jié)果是二進(jìn)制的11111110,它的運(yùn)算過(guò)程如圖4-1所示,從圖中可見(jiàn),a和b按位進(jìn)行或計(jì)算,只要有一個(gè)為1,這一位就為1,否則為0。圖4-1位或運(yùn)算代碼第④行println("a&b=\(a&b)")是進(jìn)行位與運(yùn)算,結(jié)果是二進(jìn)制的00010010,它的運(yùn)算過(guò)程如圖4-2所示,從圖中可見(jiàn),a和b按位進(jìn)行與計(jì)算,只有兩位全部為1,這一位才為1,否則為0。圖4-2位與運(yùn)算代碼第⑤行println("a^b=\(a^b)")是進(jìn)行位異或運(yùn)算,結(jié)果是二進(jìn)制的11101100,它的運(yùn)算過(guò)程如圖4-3所示,從圖中可見(jiàn),a和b按位進(jìn)行異或計(jì)算,只有兩位相反,這一位才為1,否則為0。圖4-3異或位運(yùn)算代碼第⑦行println("a>>2=\(a>>2)")是進(jìn)行右位移2位運(yùn)算,結(jié)果是二進(jìn)制的00101100,它的運(yùn)算過(guò)程如圖4-4所示,從圖中可見(jiàn),a的低位被移除掉,高位用0補(bǔ)位。圖4-4右位移2位運(yùn)算代碼第⑧行println("a<<2=\(a<<2)")是進(jìn)行左位移2位運(yùn)算,結(jié)果是二進(jìn)制的11001000,它的運(yùn)算過(guò)程如圖4-5所示,從圖中可見(jiàn),a的高位被移除掉,低位用0補(bǔ)位。圖4-5左位移2位運(yùn)算通過(guò)上面的詳細(xì)解釋?zhuān)嘈糯蠹乙呀?jīng)能夠理解上述代碼的運(yùn)行結(jié)果了,其他的不再贅述。4.5其他運(yùn)算符除了前面介紹的主要運(yùn)算符之外,還有一些其他運(yùn)算符,如下所示。三元運(yùn)算符(?:):例如x?y:z;,其中x,y和z都為表達(dá)式。括號(hào):起到改變表達(dá)式運(yùn)算順序的作用,它的優(yōu)先級(jí)最高。引用號(hào)(.):實(shí)例調(diào)用屬性、方法等操作符。賦值號(hào)(=):賦值時(shí)用等號(hào)運(yùn)算符(=)進(jìn)行的。下標(biāo)運(yùn)算符[]。箭頭(->):說(shuō)明函數(shù)或方法返回值類(lèi)型。逗號(hào)運(yùn)算符(,):用于集合分割元素。冒號(hào)運(yùn)算符(:):用于字典集合分割“鍵值”對(duì)。示例代碼如下:letscore:UInt8=80
letresult=score>60?"及格":"不及格"http://三元運(yùn)算符(?:)
println(result)
vararr=[93,5,3,55,57]//使用逗號(hào)運(yùn)算符(,)
println(arr[2])//下標(biāo)運(yùn)算符[]
varairports=["TYO":"Tokyo","DUB":"Dublin"]//使用冒號(hào)運(yùn)算符(:)
其他運(yùn)算符將在后面學(xué)習(xí)的過(guò)程中再給大家介紹。4.6本章小結(jié)通過(guò)對(duì)本章內(nèi)容的學(xué)習(xí),我們可以了解到Swift語(yǔ)言的基本運(yùn)算符,這些算符包括算術(shù)運(yùn)算符、關(guān)系運(yùn)算符、邏輯運(yùn)算符、位運(yùn)算符和其他運(yùn)算符。4.7同步練習(xí)1.下列程序段執(zhí)行后,t5的結(jié)果是()。vart1=9,t2=11,t3=8
vart4,t5:Int
t4=t1>t2?t1:t2+t1
t5=t4>t3?t4:t3
A.8B.20C.11D.92.下列程序段執(zhí)行后,b,x,y的值分別是()。varx=6,y=8
varb:Bool
b=x>y&&x++==--y
A.true,6,8B.false,7,7C.true,7,7D.false,6,83.下列執(zhí)行程序段后,b,x,y的值分別是()。varx=6,y=8
varb:Bool
b=x++==--y&&x>y
A.true,6,8B.false,7,7C.true,7,7D.false,6,84.設(shè)有定義varx=3.5,y=4.6,z=5.7,則以下的表達(dá)式中,值為true的是()。A.x>y||x>zB.x!=yC.z>(y+x)D.x<y&&!(x>z)5.下列程序段執(zhí)行后,b3的結(jié)果是()。varb1=true,b2,b3:Bool
b3=b1?b1:b2
A.0B.1C.trueD.falseE.無(wú)法編譯6.下列關(guān)于使用“<<”和“>>”操作符的結(jié)果正確的是()。A.1010000000000000>>4的結(jié)果是0000101000000000B.1010000000000000>>4的結(jié)果是1111101000000000C.0000101000000000<<2的結(jié)果是0010100000000000D.0000101000000000<<2的結(jié)果是00001010000000007.下列表達(dá)式中哪兩個(gè)相對(duì)?A.16>>2B.16/2^2C.16*4D.16<<28.下列程序段執(zhí)行后,輸出結(jié)果是()。提示:String是結(jié)構(gòu)體,它是值類(lèi)型。vara:String="123",b:String="123"
println(a===b)
a=b
println(a===b)
A.falseB.falseC.trueD.truefalsetruetruefalseE.編譯錯(cuò)誤9.下列程序段執(zhí)行后,輸出結(jié)果是()。提示:NSString是類(lèi),它是引用數(shù)據(jù)類(lèi)型。vara:NSString="123",b:NSString="123"
println(a===b)
a=b
println(a===b)
A.falseB.falseC.trueD.trueE.編譯錯(cuò)誤falsetruetruefalse10.下列程序段執(zhí)行后,輸出結(jié)果是()。vara1:String="123",b1:String="123"
vara2:NSString="123",b2:NSString="123"
println(a1==b1)
println(a2!==b2)
A.falseB.falseC.trueD.trueE.編譯錯(cuò)誤falsetruetruefalse第5章基本數(shù)據(jù)類(lèi)型我們?cè)谇懊娴恼鹿?jié)中使用到了一些數(shù)據(jù)類(lèi)型,例如UInt8、Int8和Double等,本章將詳細(xì)介紹這些數(shù)據(jù)類(lèi)型。Swift中包括了所有C和Objective-C語(yǔ)言中定義的數(shù)據(jù)類(lèi)型,并且還有一些獨(dú)有的數(shù)據(jù)類(lèi)型,如元組(tuple)等。5.1Swift數(shù)據(jù)類(lèi)型Swift中的數(shù)據(jù)類(lèi)型包括:整型、浮點(diǎn)型、布爾型、字符串、元組、集合、枚舉、結(jié)構(gòu)體和類(lèi)等。這些類(lèi)型按照參數(shù)傳遞方式的不同可以分為:值類(lèi)型和引用類(lèi)型。值類(lèi)型就是在賦值或給函數(shù)傳遞參數(shù)時(shí)候,創(chuàng)建一個(gè)副本,把副本傳遞過(guò)去,這樣在函數(shù)的調(diào)用過(guò)程中不會(huì)影響原始數(shù)據(jù)。引用類(lèi)型就是在賦值或給函數(shù)傳遞參數(shù)時(shí)候,把本身數(shù)據(jù)傳遞過(guò)去,這樣在函數(shù)的調(diào)用過(guò)程中會(huì)影響原始數(shù)據(jù)。在上述數(shù)據(jù)類(lèi)型中,整型、浮點(diǎn)型、布爾型、字符串、元組、集合、枚舉和結(jié)構(gòu)體屬于值類(lèi)型,而類(lèi)屬于引用類(lèi)型。本章將重點(diǎn)介紹整型、浮點(diǎn)型、布爾型和元組等基本數(shù)據(jù)類(lèi)型。5.2整型Swift提供8、16、32、64位形式的有符號(hào)及無(wú)符號(hào)整數(shù)。這些整數(shù)類(lèi)型遵循C語(yǔ)言的命名規(guī)約,如8位無(wú)符號(hào)整數(shù)的類(lèi)型為UInt8,32位有符號(hào)整數(shù)的類(lèi)型為Int32。我們歸納了Swift中的整型,參見(jiàn)表5-1。表5-1整型數(shù)據(jù)類(lèi)型名稱(chēng)說(shuō)明Int8有符號(hào)8位整型Int16有符號(hào)16位整型Int32有符號(hào)32位整型Int64有符號(hào)64位整型Int平臺(tái)相關(guān)有符號(hào)整型在32位平臺(tái),Int與Int32寬度一致
在64位平臺(tái),Int與Int64寬度一致UInt8無(wú)符號(hào)8位整型UInt16無(wú)符號(hào)16位整型UInt32無(wú)符號(hào)32位整型UInt64無(wú)符號(hào)64位整型UInt平臺(tái)相關(guān)無(wú)符號(hào)整型在32位平臺(tái),UInt與UInt32寬度一致
在64位平臺(tái),UInt與UInt64寬度一致除非要求固定寬的整型,否則一般我們只使用Int或UInt,這些類(lèi)型能夠與平臺(tái)保持一致。下面我們來(lái)看一個(gè)整型示例:println("UInt8range:\(UInt8.min)~\(UInt8.max)")
println("Int8range:\(Int8.min)~\(Int8.max)")
println("UIntrange:\(UInt.min)~\(UInt.max)")
println("UInt64range:\(UInt64.min)~\(UInt64.max)")
println("Int64range:\(Int64.min)~\(Int64.max)")
println("Intrange:\(Int.min)~\(Int.max)")
輸出結(jié)果如下:UInt8range:0~255
Int8range:-128~127
UIntrange:0~18446744073709551615
UInt64range:0~18446744073709551615
Int64range:-9223372036854775808~9223372036854775807
Intrange:-9223372036854775808~9223372036854775807
上述代碼是通過(guò)整數(shù)的min和max屬性計(jì)算各個(gè)類(lèi)型的范圍。min屬性獲得當(dāng)前整數(shù)的最小值,max屬性獲得當(dāng)前整數(shù)的最大值。由于程序運(yùn)行的電腦是64位的,UInt運(yùn)行的結(jié)果與UInt64相同,Int運(yùn)行的結(jié)果與Int64相同。我們?cè)谇懊娴膶W(xué)習(xí)過(guò)程中聲明過(guò)變量,有時(shí)明確指定數(shù)據(jù)類(lèi)型,有時(shí)則沒(méi)有指定,例如下面的代碼:varageForStudent=30
varscoreForStudent:Int=90
變量ageForStudent沒(méi)有指定任何數(shù)據(jù)類(lèi)型,但是我把30賦值給它,30表示Int類(lèi)型30,因此ageForStudent類(lèi)型就被確定為Int,這就是Swift提供的類(lèi)型推斷功能。此后我們就不能把非Int數(shù)值賦值給ageForStudent。如下代碼是有編譯錯(cuò)誤的:varageForStudent=30
ageForStudent="20"
代碼ageForStudent="20"會(huì)發(fā)生編譯錯(cuò)誤,這是因?yàn)槲覀冊(cè)噲D將20字符串賦值給Int類(lèi)型的ageForStudent變量。5.3浮點(diǎn)型浮點(diǎn)型主要用來(lái)儲(chǔ)存小數(shù)數(shù)值,也可以用來(lái)儲(chǔ)存范圍較大的整數(shù)。它分為浮點(diǎn)數(shù)(float)和雙精度浮點(diǎn)數(shù)(double)兩種,雙精度浮點(diǎn)數(shù)所使用的內(nèi)存空間比浮點(diǎn)數(shù)多,可表示的數(shù)值范圍與精確度也比較大。下面我們歸納Swift中的浮點(diǎn)型,如表5-2所示。表5-2浮點(diǎn)型數(shù)據(jù)類(lèi)型名稱(chēng)說(shuō)明Float32位浮點(diǎn)數(shù)不需要很多大的浮點(diǎn)數(shù)時(shí)候使用Double64位浮點(diǎn)數(shù)默認(rèn)的浮點(diǎn)數(shù)下面我們來(lái)看一個(gè)浮點(diǎn)型示例:varmyMoney:Float=300.5;①
varyourMoney:Double=360.5;②
letpi=3.14159③
上述代碼第①行明確指定變量myMoney是Float類(lèi)型,第②行代碼明確指定變量yourMoney是Double類(lèi)型,第③行pi沒(méi)有明確數(shù)據(jù)類(lèi)型,但是我們給它賦值為3.14159,Swift編譯器會(huì)自動(dòng)推斷出它是Double類(lèi)型,注意
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年工廠股權(quán)轉(zhuǎn)讓與產(chǎn)業(yè)園區(qū)配套設(shè)施建設(shè)合同3篇
- 個(gè)人貸款延期合同書(shū)2024版標(biāo)準(zhǔn)格式版B版
- 二零二五年度啤酒節(jié)場(chǎng)地租賃合同(含設(shè)備安裝與維護(hù)服務(wù))3篇
- 2025年度朋友合資經(jīng)營(yíng)兒童游樂(lè)場(chǎng)合同4篇
- 二零二五版綠色建筑項(xiàng)目材料集中采購(gòu)合同3篇
- 二零二五年度內(nèi)墻膩?zhàn)赢a(chǎn)品責(zé)任保險(xiǎn)合同
- 2025年度生態(tài)旅游區(qū)臨設(shè)轉(zhuǎn)讓及生態(tài)保護(hù)合同4篇
- 2025版土地居間業(yè)務(wù)規(guī)范化合同書(shū)(正規(guī)范本)6篇
- 二零二五年度啤酒產(chǎn)品節(jié)慶活動(dòng)專(zhuān)用代理合同
- 二零二五年度二手車(chē)買(mǎi)賣(mài)及二手車(chē)評(píng)估合同協(xié)議2篇
- 2023年廣東省公務(wù)員錄用考試《行測(cè)》真題及答案解析
- 2024年公證遺產(chǎn)繼承分配協(xié)議書(shū)模板
- 燃?xì)饨?jīng)營(yíng)安全重大隱患判定標(biāo)準(zhǔn)課件
- 深圳小學(xué)英語(yǔ)單詞表(中英文)
- 護(hù)理質(zhì)量反饋內(nèi)容
- 山東省濟(jì)寧市2023年中考數(shù)學(xué)試題(附真題答案)
- 抖音搜索用戶(hù)分析報(bào)告
- 鉆孔灌注樁技術(shù)規(guī)范
- 2023-2024學(xué)年北師大版必修二unit 5 humans and nature lesson 3 Race to the pole 教學(xué)設(shè)計(jì)
- 供貨進(jìn)度計(jì)劃
- 彌漫大B細(xì)胞淋巴瘤護(hù)理查房
評(píng)論
0/150
提交評(píng)論