參考教案the swift programming language中文版_第1頁(yè)
參考教案the swift programming language中文版_第2頁(yè)
參考教案the swift programming language中文版_第3頁(yè)
參考教案the swift programming language中文版_第4頁(yè)
參考教案the swift programming language中文版_第5頁(yè)
已閱讀5頁(yè),還剩441頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

歡迎使用 關(guān)于 Swift初 簡(jiǎn)單 控制 函數(shù)和閉 對(duì)象和 接口和擴(kuò) 泛 Swift...................................................................................................................................基礎(chǔ)部 常量和變 注 分 整 浮點(diǎn) 類型別 布爾 元 可 斷 基本運(yùn)算 術(shù) 賦值運(yùn)算 數(shù)值運(yùn) 復(fù)合賦 比較運(yùn) 區(qū)間運(yùn)算 邏輯運(yùn) 字符串插 比較字符 集合類 數(shù) 字 控制 For循 While循 條件語(yǔ) 函 函數(shù)形參 函數(shù)類 嵌套函 閉 閉包表達(dá) Trailing閉 捕獲 閉包是類 枚 關(guān)聯(lián)值(Associated 類和結(jié)構(gòu) 類是類 屬 屬 計(jì)算屬 屬性監(jiān)視 類型屬 方 實(shí)例方法(Instance 類型方法(Type 附屬....................................................................................................................附屬語(yǔ) 附屬用 附屬選 繼 定義一個(gè)基類(Base 重寫 防止重 構(gòu)造過(guò) 默認(rèn)構(gòu)造 值類型的構(gòu)造器................................................................................................... 反初始 反初始 自動(dòng)計(jì) ARC如何工 ARC實(shí) 類實(shí)例間的強(qiáng) 解決實(shí)例間的強(qiáng) 解決閉包產(chǎn)生的強(qiáng) 自判斷................................................................................................................ 為自判斷定義模型 使用自判斷調(diào)用子.......................................................................................連接多層............................................................................................................... 類型轉(zhuǎn) 檢查類 向下(簡(jiǎn)稱下轉(zhuǎn) Any和AnyObject的轉(zhuǎn) 類型嵌 擴(kuò) 構(gòu)造器 方法 下標(biāo) 協(xié) 協(xié)議的語(yǔ) 屬性要 方法要 協(xié)議類 委托()模 通過(guò)延展補(bǔ)充協(xié)議............................................................................................... 協(xié)議的繼 協(xié)議合 泛 泛型函 類型參 泛型類 類型約 關(guān)聯(lián)類 Where語(yǔ) 高級(jí)運(yùn)算 位運(yùn)算 溢出運(yùn)算 運(yùn)算符函 語(yǔ)言附 詞法結(jié) 空白與注 標(biāo)識(shí) 關(guān)鍵 字面 運(yùn)算 類 類型注 類型標(biāo)識(shí) 元組類 函數(shù)類 數(shù)組類 可選類 元類 類型推 表達(dá) 語(yǔ) 循環(huán)語(yǔ) 分支語(yǔ) 帶的語(yǔ) ................................................................................................................................模塊范 代碼 引入.......................................................................................................................常量.......................................................................................................................變量.......................................................................................................................函數(shù).......................................................................................................................枚舉.......................................................................................................................結(jié)構(gòu)體...................................................................................................................協(xié)議.......................................................................................................................構(gòu)造器...................................................................................................................析構(gòu).......................................................................................................................擴(kuò)展.......................................................................................................................附屬...............................................................................................................運(yùn)算符...................................................................................................................特 特 類型特 模 泛型參 語(yǔ)法總 語(yǔ) 泛型參 ...............................................................................................................................模 特 表達(dá) 詞法結(jié) 類 歡迎使用重要:本系列是針對(duì)開發(fā)過(guò)程中的API或者技術(shù)的初步文檔。蘋果提供該文檔旨在為開發(fā)者的軟件應(yīng)該使用最終操作系統(tǒng)軟件和文檔進(jìn)試。文檔的新版本可能會(huì)提供新的API和SwiftiOSOSXCObjective-CC語(yǔ)言的兼容性限制。Swift采用安全的編程模式,增加了現(xiàn)代功能使編程更容易、更靈活、更有趣。SwiftCocoaCocoaTouch框架為stack建立在堅(jiān)實(shí)的FoundationCocoa基礎(chǔ)之上實(shí)現(xiàn)了現(xiàn)代化和徹底標(biāo)準(zhǔn)Objective-C本身已經(jīng)逐步發(fā)展到到支持blocks、collectionlils和modules,使框架不間斷地采用現(xiàn)代語(yǔ)言技術(shù)。基于這個(gè)基礎(chǔ),我們可以為今后的Apple軟件開發(fā)引入一種新語(yǔ)言。CocoaObjective-C混編的能力?;谶@個(gè)共同點(diǎn),Swift引入了許多新的特性、統(tǒng)一的程序和面向?qū)ο蟮恼Z(yǔ)言部分。Swift對(duì)于新程序員是友好的,作為一個(gè)具有表現(xiàn)力和令人愉悅的語(yǔ)言,它是第一個(gè)獲Swift從廣闊的蘋果工程師文化中結(jié)合了最好的現(xiàn)代語(yǔ)言思維和智慧。編譯器針對(duì)性能進(jìn)行了優(yōu)化,語(yǔ)言也針對(duì)開發(fā)進(jìn)行了優(yōu)化,無(wú)需任何妥協(xié)。它的設(shè)計(jì)從“oWorld”擴(kuò)展到整個(gè)操作系統(tǒng)。這一切使得Swift對(duì)于開發(fā)者和Apple是一個(gè)有意義的投資。Swift初見通常來(lái)說(shuō),編程語(yǔ)言中的第一個(gè)程序應(yīng)該在屏幕上打印“o,world”。在Swift中,可 o, CObjective-C代碼,那你應(yīng)該很熟悉這種形式——Swift中,這行代這個(gè)會(huì)通過(guò)一系列編程例子來(lái)讓你對(duì)Swift有初步了解,如果你有什么不理解的地方使用let來(lái)常量,使用var來(lái)變量。一個(gè)常量的值在編譯時(shí)并不需要獲取,但是你varvarmyVariable=myVariable=letmyConstant=myVariable是一個(gè)整letletimplicitInteger=letimplicitDouble=letexplicitDouble:Double=練習(xí):創(chuàng)建一個(gè)常量,顯式指定類型為Float并指定初始值為4letletlabel="Thewidthletwidth=letwidthLabel=label+練習(xí):刪除最后一行中 String,錯(cuò)誤提示是什么letapplesletapples=letoranges=letappleSummary="Ihave\(apples)letfruitSummary="Ihave\(apples+oranges)piecesof練習(xí):使用()來(lái)把一個(gè)浮點(diǎn)計(jì)算轉(zhuǎn)換成字符串,并加上的名字,和他打個(gè)招呼。使括來(lái)數(shù)字并下者e)1.1.varList=["catfish","water","tulips","bluevarvaroccupations=["Malcolm":"Captain","Kaylee":]occupations["Jayne"]="PublicList[1]="bottleofletletemptyArray=letemptyDictionary=Dictionary<String,如果類型信息可以被推斷出來(lái),你可以用[]和[:]來(lái)創(chuàng)建空數(shù)組和空字典——就像你變量1.1. List= //去逛街并買點(diǎn)東 letindividualScores=[75,43,103,87,varteamScoreletindividualScores=[75,43,103,87,varteamScore=forscoreinindividualScoresifscore>50teamScore+=}elseteamScore+=}}varoptionalString:String?=optionalString==varoptionalName:String?="Johnvargreeting=ifletname={greeting=o,}將值賦給let后面的常量,這樣代碼塊中就可以使用這個(gè)值了。letvegetable="redswitchvegetablecasement="Addsomeraisinsandmakeantsonacase"cucumber",ment="Thatwouldmakeagoodteacaseletxwherement="Isitaspicyment="Everythingtastesgoodin練習(xí)刪除default語(yǔ)句,看看會(huì)有什么需要在每個(gè)子句結(jié)尾寫break。letletinterestingNumbers="Prime":[2,3,5,7,11,"Fibonacci":[1,1,2,3,5,"Square":[1,4,9,16,5.varlargest=for(kind,numbers)ininterestingNumbersfornumberinnumbersifnumber>largestlargest= 練習(xí):添加另一個(gè)變量來(lái)記錄哪種類型的數(shù)字是最大的。varn=whilen<{n=n*}nvarm=dom=m*}whilem<mvarfirstForLoop=foriin0..3{firstForLoop+=i}varsecondForLoop=forforvari=0;i<3;++isecondForLoop+=1.funcgreet(name:String,day:String)->String3.returno\(name),todayis4.greet("Bob"1.funcgreet(name:String,day:String)->String3.returno\(name),todayis4.greet("Bob",練習(xí)day參數(shù),添加一個(gè)參數(shù)來(lái)表示今天吃了什么午飯。funcfuncgetGasPrices()->(Double,Double,Double)return(3.59,3.69,3.4.funcfuncsumOf(numbers:Int...)->Intvarsum=fornumberinnumberssum+= return7.sumOf(42,597,練習(xí):寫一個(gè)計(jì)算參數(shù)平均值的funcfuncreturnFifteen()->Intvary=funcadd()y+= return8.9.funcfuncmakeIncrementer()->(Int->Int)funcaddOne(number:Int)->Intreturn1+ return6.varincrement=funcfunchasAnyMatches(list:Int[],condition:Int->Bool)->Boolforiteminlistifcondition(item)return return8.funclessThanTen(number:Int)->Boolreturnnumber<varnumbers=[20,19,7,(number:Int)->Intletresult=3*return練習(xí):重寫閉包,對(duì)所有奇數(shù)返回01.sort([1,5,3,12,2]){$0>$1 classclassShapevarnumberOfSides=funcsimpleDescription()->Stringreturn"Ashapewith\(numberOfSides) 6. varvarshape=shape.numberOfSides=3.varshapeDescription= Shapeinit來(lái)classNamedShapevarnumberOfSides:Int=varname:init(name:{=}funcsimpleDescription()->Stringreturn"Ashapewith\(numberOfSides)}器(就像name。override標(biāo)記的方法是否確實(shí)在父類中。classSquare:NamedShapevarsideLength:init(sideLength:Double,name:{self.sideLength=sideLengthsuper.init(name:name)numberOfSides=4}letlettest=Square(sideLength:5.2,name:"mytestoverridefuncsimpleDescription()->Stringreturn"Asquarewithsidesoflength}funcarea()->DoublereturnsideLength*}名稱,實(shí)現(xiàn)area和describe方法。gettersetter ltriaglewithsidesoflengthreturn"AnoverridefuncsimpleDescription()->StringvarsideLength:Double=init(sideLength:Double,name:{self.sideLength=sideLengthsuper.init(name:name)numberOfSides=3}varperimeter:{getreturn3.0*}setsideLength=newValue/}}lTriangle:NamedShapeclassvartriangle= lTriangle(sideLength:3.1,name:"a)triangle.perimeter= 設(shè)置子類的屬性改變父類定義的屬性值。其他的工作比如調(diào)用方法、getterssetters也可以在這個(gè)階classTriangleAndSquarevartriangle:EquilawillSet{lTrianglesquare.sideLength=}}varsquare:Square{willSet{triangle.sideLength=}}init(size:Double,name:String)square=Square(sideLength:size,name:triangle=lTriangle(sideLength:size,name:}17.vartriangleAndSquare=TriangleAndSquare(size:10,name:"anotherttriangleAndSquare.square=Square(sideLength:50,name:"largersquareclassclassCountervarcount:Int=funcincrementBy(amount:Int,numberOfTimestimes:Int)count+=amount* 6.varcounter=是nil,?后面的東西都會(huì)被忽略,并且整個(gè)表達(dá)式返回nil否則,?之后的東西都會(huì)被運(yùn)行。letletoptionalSquare:Square?=Square(sideLength:2.5,name:"optionalletsideLength=TheSwiftProgrammingLanguage中文 精校casereturncasereturncasereturnreturn}}ace=aceRawValue=ififletconvertedRank=Rank.fromRaw(3)letthreeDescription=3.enumenumSuitcaseSpades,Hearts,Diamonds,funcsimpleDescription()->Stringswitchselfcasereturncasereturncasereturncasereturn}}注意:有兩種方式可以Hearts成員:給hearts常量賦值時(shí),枚舉成員Suit.Hearts需,因?yàn)閟elf的值已經(jīng)知道是一個(gè)suit。已知變量類型的情況下你可以使用縮寫。構(gòu)體之間最大的一個(gè)區(qū)別就是結(jié)構(gòu)體是傳值,類是傳。structstructCardvarrank:varsuit:funcsimpleDescription()->Stringreturn"The\(rank.simpleDescription())of 8.letthreeOfSpades=Card(rank:.Three,suit:letthreeOfSpadesDescription=casecaselet.Result(sunrise,letserverResponse="Sunriseisat\(sunrise)andsunsetis\(caseletletserverResponse="Failure...letsuccess=ServerResponse.Result("6:00am","8:09pm")letfailure=ServerResponse.Error("Outofcheese.")switchsuccessenumServerResponsecaseResult(String,case}練習(xí)ServerResponseswitch添加第三種情況。注意ServerResponse中提取日升和日落時(shí)間。protocolprotocolExampleProtocolvarsimpleDescription:String{getmutatingfunc4.classclassSimpleClass:ExampleProtocolvarsimpleDescription:String="AverysimplevaranotherProperty:Int=funcadjust()simpleDescription+="Now100% 7.varvara=letaDescription=a.simpleDescriptionstructSimpleStructure:ExampleProtocolvarsimpleDescription:String="Asimplemutatingfuncadjust()simpleDescription+=" varb=letbDescription=練習(xí):寫一個(gè)實(shí)現(xiàn)這個(gè)接口的枚舉。注意:SimpleStructure時(shí)候mutating關(guān)鍵字用來(lái)標(biāo)記一個(gè)會(huì)修改結(jié)構(gòu)體的方法extensionextensionInt:ExampleProtocolvarsimpleDescription:Stringreturn"Thenumber}mutatingfuncadjust()self+= 8.練習(xí)Double類型寫一個(gè)擴(kuò)展,添加absoluteValueletletprotocolValue:ExampleProtocol=//protocolValue.anotherPropertymenttoseethe即使protocolValue變量運(yùn)行時(shí)的類型是simpleClass,編譯器會(huì)把它的類型當(dāng)做funcfuncrepeat<ItemType>(item:ItemType,times:Int)->ItemType[]varresult=foriin0..timesresult+= return7.8.repeat("knock",////ReimplementtheSwiftstandardlibrary'soptionalenumOptionalValue<T>casecase5.varpossibleInteger:OptionalValue<Int>=possibleInteger=where來(lái)指定一個(gè)需求列表——例如,要限定實(shí)現(xiàn)一個(gè)協(xié)議的類型,需1.1.monElements<T,UwhereT:Sequence,U:Sequence,orType.Element:Equatable,T.GeneratorType.Element==U.GeneratorType.Element>(lhs:T,rhs:U)->Bool{forlhsIteminlhsforrhsIteminrhsiflhsItem==rhsItem}}returnmonElements([1,2,3],}}return練習(xí):修改 monElements函數(shù)來(lái)創(chuàng)建一個(gè)函數(shù),返回一個(gè)數(shù)組,內(nèi)容是兩個(gè)序列T:Equatable>是等價(jià)的。 主頁(yè)),lyuka( 主頁(yè)),JaySurplus( SwiftiOSOSXCObjective-SwiftSwift的類型是在C和Objective-C的基礎(chǔ)上,Int是整型;Double和Float是浮點(diǎn)型;Bool是布爾型;String是字符串。Swift還有兩個(gè)有用的集合類型,Array和就像C語(yǔ)言一樣,Swift使用變量來(lái)進(jìn)行并通過(guò)變量名來(lái)關(guān)聯(lián)值。在Swift中,值不可變的變量有著廣泛的應(yīng)用,它們就是常量,而且比C語(yǔ)言的常量更強(qiáng)大。在Swift除了我們熟悉的類型,SwiftObjective-C中沒有的類型比如元組(Tuple)。元Swift還增加了可選(Optional)類型,用于處理值缺失的情況??蛇x表示“那兒有一個(gè)x或者“那兒沒有值”O(jiān)bjective-Cnil,但是它可Objective-Cnil指針更加安全也更具表現(xiàn)力,它是Swift許多強(qiáng)大特性的重要組成部分。Swift是一個(gè)類型安全的語(yǔ)言,可選就是一個(gè)很好的例子。Swift可以讓你清楚地知道值的常量和變量把一個(gè)名字(比如umNumberOfLoginAttemptseMessage)和一個(gè)指定類型的值(比如數(shù)字10或者字符串" 聲明常量和變量常量和變量必須在使用前,用let來(lái)常量,用var來(lái)變量。下面的例子展示了1.1.umNumberOfLoginAttempts=2.varcurrentLoginAttempt=“一個(gè)名字是umNumberOfLoginAttempts的新常量,并給它一個(gè)值10。然后,一個(gè)名字是currentLoginAttempt的變量并將它的值初始化為0.” varx=0.0,y=0.0,z= 類型標(biāo)當(dāng)你常量或者變量的時(shí)候可以加上類型標(biāo)注(typeannotation),說(shuō)明常量或者變量中要 eMessage: “一個(gè)類型為String,名字為eMessage的變量。”“類型為String”的意思是“可以任意String類型的值。”eMessage= eMessage賦初始值,所以變量 eMessage的類型是通過(guò)一常量和變量letπ= letlet"你好世界let????????=常量與變量名不能包含數(shù)學(xué)符號(hào),箭頭,保留的(或者的)Unicode碼位,連線與制Swift保留關(guān)鍵字相同的名稱作為常量或者變量名,你可以使用 e的值 e=e=e現(xiàn)在letletlanguageName=languageName=languageName不可改輸出常量和變量//輸出printlnXcode,println將會(huì)輸出內(nèi)容到“console”面板上。(另一種函數(shù)叫print,唯一區(qū)別是在輸出內(nèi)容最后不會(huì)println(println("Thisisa"ThisisaCocoaNSLog函數(shù)類似的是,println函數(shù)可以輸出更復(fù)雜的信息。這些信息可以Swift用字符串插值(stringinterpolation)的方式把常量名或者變量名當(dāng)做占位符加入到長(zhǎng)字符串中,Swift會(huì)用當(dāng)前常量或變量的值替換這些占位符。將常量或變量名放入圓括println(println("Thecurrentvalue"Thecurrentvalueeiseis請(qǐng)將你的代碼中的非執(zhí)行文本注釋成提示或者筆記以方便你將來(lái)閱讀。Swift的編譯器將SwiftC語(yǔ)言的注釋非常相似。單行注釋以雙正斜杠作(//)為起始標(biāo)記1.1.這是一個(gè)注/*/*這是一個(gè)多行注釋C語(yǔ)言多行注釋不同,Swift的多行注釋可以嵌套在其它的多行注釋之中。你可以先生/*/*/*這是第二個(gè)被嵌套的多行注釋這是第一個(gè)多行注釋的結(jié)尾與其他大部分編程語(yǔ)言不同,Swift并不強(qiáng)制要求你在每條語(yǔ)句的結(jié)尾處使用分號(hào)(;),letletcat="????";//輸出Swift8,16,3264C語(yǔ)言的8UInt8,32Int32。就像Swift的其他類型一樣,整數(shù)類型采用大寫命名法。整數(shù)范letletminValueUInt8.minminValue0UInt8letmaxValueUInt8.maxmaxValue255,是UInt8類型的最大一般來(lái)說(shuō),你不需要專門指定整數(shù)的長(zhǎng)度。SwiftInt,長(zhǎng)度與32位平臺(tái)上,IntInt3264位平臺(tái)上,IntInt64性。即使是在32位平臺(tái)上,Int可以的整數(shù)范圍也可以達(dá)到- 浮點(diǎn)類型比整數(shù)類型表示的范圍更大,可以比Int類型更大或者更小的數(shù)字。Swift提注意:Double15Float6位數(shù)字。選擇哪個(gè)類Swift是一個(gè)類型安全(typesafe的語(yǔ)言。類型安全的語(yǔ)言可以讓你清楚地知道代碼要處理的值的類型。如果你的代碼需要一個(gè)String,你絕對(duì)不可能不傳進(jìn)去一個(gè)Int。Swift是類型安全的,所以它會(huì)在編譯你的代碼時(shí)進(jìn)行類型檢查(typechecks),并把常量和變量的時(shí)候都需要顯式指定類型。如果你沒有顯式指定類型,Swift測(cè)(typeinference)來(lái)選擇合適的類型。有了類型推測(cè),編譯器可以在編譯代碼的時(shí)候自動(dòng)因?yàn)橛蓄愋屯茰y(cè),和C或者Objective-C比起來(lái)Swift很少需要類型。常量和變量當(dāng)你常量或者變量并賦初值的時(shí)候類型推測(cè)非常有用。當(dāng)你在常量或者變量的時(shí)候賦給它們一個(gè)字面量(lilvalue或lil)即可觸發(fā)類型推測(cè)。(字面量就是會(huì)直接出現(xiàn)在你代碼中的值,比如42和3.14159。)letletmeaningOfLife=meaningOfLife會(huì)被推測(cè)為Int類letpi=letpi=pi會(huì)被推測(cè)為Double類當(dāng)推測(cè)浮點(diǎn)數(shù)的類型時(shí),SwiftDoubleFloat。letletanotherPi=3+anotherPi會(huì)被推測(cè)為Double類DoubleletdecimalInteger=letbinaryInteger=letoctalInteger=lethexadecimalInteger=

二進(jìn)制八進(jìn)制十六(exponent)e來(lái)指定,在十六進(jìn)制浮點(diǎn)數(shù)中通過(guò)大寫或者小寫的p來(lái)指定。1.25e2$1.2510^{2}$125.01.25e-2$1.2510^{-2}$0.01250xFp2表示$15×2^{2}$,等于60.0。0xFp-2$152^{-2}$3.75letletdecimalDouble=letexponentDouble=lethexadecimalDouble=letletpaddedDouble=letoneMillion=letjustOverOneMillion=Int類型??偸鞘褂媚J(rèn)的整數(shù)轉(zhuǎn)不同整數(shù)類型的變量和常量可以不同范圍的數(shù)字。Int8類型的常量或者變量可以letcannotBeNegative:UInt8=-UInt8lettooBig:Int8=Int8.max+Int8類型不由于每中整數(shù)類型都可以不同范圍的值,所以你必須根據(jù)不同情況選擇性使用數(shù)值型twoThousandUInt16類型,然而來(lái)創(chuàng)建一個(gè)新的UInt16one的值來(lái)初始化,然后使用這個(gè)新數(shù)字來(lái)計(jì)算:letlettwoThousand:UInt16=2letone:UInt8=lettwoThousandAndOne=twoThousand+被推測(cè)為UInt16,因?yàn)樗莾蓚€(gè)UInt16值的和。SomeType(ofInitialValue)是調(diào)用Swift構(gòu)造器并傳入一個(gè)初始值的默認(rèn)方法。在語(yǔ)言內(nèi)整數(shù)和浮點(diǎn)數(shù)轉(zhuǎn)letletthree=letpointOneFourOneFiveNine=letpi=Double(three)+pi等于3.14159,所以被推測(cè)為Double類letletintegerPi=integerPi等于3,所以被推測(cè)為Int類3.9會(huì)變成-30.14159相加,因?yàn)閿?shù)字字面量本身沒有明確的類型。它們的類型只在編譯器需要求值的1.typealiasAudioSample= varvarmaxAmplitudeFound=maxAmplitudeFound現(xiàn)在是實(shí)際上是UInt16.min,所以會(huì)給maxAmplitudeFound賦一個(gè)初值0。Swift有一個(gè)基本的布爾(Boolean)Bool。布爾值指邏輯上的(logical),因?yàn)樗鼈冎荒苁钦婊蛘呒?。Swift有兩個(gè)布爾常量,true和false:letletorangesAreOrange=letturnipsAreDelicious=orangesAreOrange和turnipsAreDeliciousBool,因?yàn)樗鼈兊某踔凳遣颊遞alse,那你不需要將常量或者變量為Bool類型。初始化常量或者變量的時(shí)候如果所賦的值類型已知,就可以觸發(fā)類型推測(cè),這讓Swift代碼更加簡(jiǎn)潔并且可讀性更高。ififturnipsAreDeliciousprintln("Mmm,tasty}elseprintln("Eww,turnipsare5.6.輸出"EwwturnipsareBool類型的地方使用了非布爾值,Swift的類型安全機(jī)制會(huì)報(bào)錯(cuò)。下面letleti=ifi4.letleti=ifi==14.和Swift中的其他類型安全的例子一樣,這個(gè)方法可以避免錯(cuò)誤這塊代碼的意圖總下面這個(gè)例子中,(404,"NotFound")HTTP狀態(tài)碼(HTTPstatuscode)的元組。HTTPweb服務(wù)器返回的一個(gè)特殊值。如果你請(qǐng)求的網(wǎng)頁(yè)不存在就會(huì)返回一個(gè)404NotFound狀態(tài)碼。letlethttp404Error=(404,"Nothttp404Error的類(IntString),值是(404,"Not(404NotFound")IntStringHTTP狀態(tài)碼的兩個(gè)部分:一個(gè)數(shù)字和一個(gè)人類可讀的描述。這個(gè)元組可以被描述為“一個(gè)類型為(IntString)的以創(chuàng)建一個(gè)類型為(Int,Int,Int)或者(String,Bool)或者其他任何你想要的組合的元組。 letlet(statusCode,statusMessage)=println("Thestatuscodeis輸出"Thestatuscodeisprintln("Thestatusmessageis輸出"ThestatusmessageisNotletlet(justTheStatusCode,_)=println("Thestatuscodeis輸出"Thestatuscodeisprintln(println("Thestatuscodeis輸出"Thestatuscodeisprintln("Thestatusmessageis輸出"ThestatusmessageisNot1.lethttp200Status=(statusCode:200,description: println(println("Thestatuscodeis輸出"Thestatuscodeisprintln("Thestatusmessageis輸出"Thestatusmessageis作為函數(shù)返回值時(shí),元組非常有用。一個(gè)用來(lái)獲取網(wǎng)頁(yè)的函數(shù)可能會(huì)返回一個(gè)(IntString)(06_Functions.html#Function_Parameters_and_Return_Values)。-注意:C和Objective-C中并沒有可選這個(gè)概念。最接近的是Objective-C中的一個(gè)特對(duì)對(duì)象起作用——對(duì)于結(jié)構(gòu)體,基本的C類型或者枚舉類型不起作用。對(duì)于這些類型,Objective-C方法一般會(huì)返回一個(gè)特殊值(比如NSNotFound)來(lái)暗示值缺失。這種方法假設(shè)方法的調(diào)用者知道并記得對(duì)特殊值進(jìn)行判斷。然而,Swift的可選可以讓你暗示任意來(lái)看一個(gè)例子。SwiftStringtoIntString值轉(zhuǎn)換Int值。然而,并不是所有的字符串都可以轉(zhuǎn)換成一個(gè)整數(shù)。字符串"123"可以被轉(zhuǎn)換成數(shù)字123,但是字符串"o,world"不行。letletpossibleNumber=letconvertedNumber=convertedNumber被推測(cè)為類型"Int?"者類型"optionalif語(yǔ)句以及強(qiáng)制解析值,結(jié)果是false。ififconvertedNumber println("\(possibleNumber)hasanintegervalueof\(convertedNumb}elseprintln("\(possibleNumber)couldnotbeconvertedtoan5.6.輸出"123hasanintegervalueof定要確定可選包含一個(gè)非nil的值??蛇x綁使用可選綁定(optionalbinding)來(lái)判斷可選是否包含值,如果包含就把值賦給一個(gè)臨時(shí)ifwhile語(yǔ)句中來(lái)對(duì)可選的值進(jìn)行判斷并把值賦給一個(gè)常量或者變量。if和while語(yǔ)句,請(qǐng)參考控制流。ififletconstantName=someOptional3.ififletactualNumber=possibleNumber.toInt() println("\(possibleNumber)hasanintegervalueof\(actualNumber)}elseprintln("\(possibleNumber)couldnotbeconvertedtoan5.6."123hasanintegervalueof的值初始化過(guò),所以不需要再使用!后綴來(lái)獲取它的值。在這個(gè)例子中,actualNumber只你可以在可選綁定中使用常量和變量。如果你想在if語(yǔ)句的第一個(gè)分支中操作varvarserverResponseCode:Int?=serverResponseCodeIntserverResponseCode=serverResponseCode現(xiàn)在不包含varvarsurveyAnswer:surveyAnswer被自動(dòng)設(shè)置為注意:SwiftnilObjective-CnilObjective-C中,nil是一個(gè)指向Swift中,nil不是指針——它是一個(gè)確定的值,用來(lái)表示值缺失。任何類型的可選都可以被設(shè)置為nil,不只是對(duì)象類型。隱式解析可選這種類型的可選被定義為隱式解析可選(implicitlyunwrappedoptionals)。把想要用作可選的類型的后面的問號(hào)(String?)改成感嘆號(hào)(String!)來(lái)一個(gè)隱式解析可選。解析可選主要被用在Swift中類的構(gòu)造過(guò)程中,請(qǐng)參考類實(shí)例之間的循環(huán)強(qiáng)。letpossibleStringString"Anoptionalstring."println(possibleString!)//需要驚嘆號(hào)來(lái)獲取值輸出"AnoptionalletassumedString:String!="Animplicitlyunwrappedoptional"不需要輸出"AnimplicitlyunwrappedoptionalififassumedString3.4."AnimplicitlyunwrappedoptionalififletdefiniteString=assumedString3.4."Animplicitlyunwrappedoptional生命周期中判斷是否是nil的話,請(qǐng)使用普通可選類型。使用斷言進(jìn)行調(diào)斷言會(huì)在運(yùn)行時(shí)判斷一個(gè)邏輯條件是否為true。從字面意思來(lái)說(shuō),斷言“斷言”一個(gè)條件是如果你的代碼在調(diào)試環(huán)境下觸發(fā)了一個(gè)斷言,比如你在Xcode中構(gòu)建并運(yùn)行一個(gè)應(yīng)用,letage=-assert(age>=0,'sagecannotbelessthanage0age0trueage的值age的值是負(fù)數(shù),就像代碼中那樣,age0false,斷言被觸發(fā),1.assert(age>= 何時(shí)使用斷言出現(xiàn)。然而,在你的應(yīng)用發(fā)布之前,有時(shí)候條件可能出現(xiàn),這時(shí)使用斷言可以快速發(fā)基本運(yùn)算符本篇譯者 運(yùn)算符是檢查,改變,合并值的特殊符號(hào)或短語(yǔ).例如,+把計(jì)算兩個(gè)數(shù)的和(let12).復(fù)雜些的運(yùn)行算包括邏輯與&&(如ifenteredDoorCode&&++i這樣讓自身加一的便捷運(yùn)算SwiftC語(yǔ)言的運(yùn)算符,且改進(jìn)許多特性來(lái)減少常規(guī)編碼錯(cuò)誤.如,=不返回值,===Bug.數(shù)值運(yùn)算符(+,-,*,/,%等)會(huì)檢測(cè)并不允許值溢出以此來(lái)避免保存變量時(shí)由于變量大于或小于其類型所能承載的范圍時(shí)導(dǎo)致的異常結(jié)果.Swift的溢出運(yùn)算符來(lái)玩溢出.具體使用請(qǐng)移步溢區(qū)別于C語(yǔ)言,Swift中你可以對(duì)浮點(diǎn)數(shù)進(jìn)行取余運(yùn)算(%),還提供了C語(yǔ)言沒有的表達(dá)兩數(shù)之間的值的區(qū)間運(yùn)算符,(a..b和a...b),這方便我們表達(dá)一個(gè)區(qū)間內(nèi)的數(shù)值.本章節(jié)只描述了Swift中的基本運(yùn)算符,高級(jí)運(yùn)算符包含了高級(jí)運(yùn)算符,及如何自定義運(yùn)算符,及如何進(jìn)行自定義類型的運(yùn)算符重載.運(yùn)算符有一目,雙目和三目運(yùn)算符一目運(yùn)算符對(duì)單一操作對(duì)象操作,-一目運(yùn)算符分前置符和后置運(yùn)算符,前置運(yùn)算符需緊排操作對(duì)象之前,如!b,后置運(yùn)算符需緊跟操作對(duì)象之后,如i++,雙目運(yùn)算符操作兩個(gè)操作對(duì)象,23.是中置的,因?yàn)樗鼈兂霈F(xiàn)在兩個(gè)操作對(duì)象之間三目運(yùn)算符操作三個(gè)操作對(duì)象,和C語(yǔ)言一樣Swift只有一個(gè)三目運(yùn)算符,就是三目條件運(yùn)算符a?b:c.受運(yùn)算符影響的值叫操作數(shù),1+2中,+是雙目運(yùn)算符,它的兩個(gè)操作數(shù)是值1和2.ab,ba的值letletb=vara=a=//a現(xiàn)在等于,letlet(x,y)=(1,//現(xiàn)在x等于1,y等于.ififx=y此句錯(cuò)誤,因?yàn)閤y并不返回任何3.這個(gè)特性使得你不無(wú)法把==錯(cuò)寫成=了,ifx=y是錯(cuò)誤代碼,Swift從底層幫你避免了加法+-*1.1+32.5-23.2*64.10.02.5與C語(yǔ)言和Objective-C不同的是Swift默認(rèn)不允許在數(shù)值運(yùn)算中出現(xiàn)溢出情況.但你可以使用Swift的溢出運(yùn)算符來(lái)達(dá)到你有目的的溢出,(如a&+b).移步:溢出運(yùn)算符.+也用于字符串的拼接1.1.o,world"等于o, 兩個(gè)字符類型或一個(gè)字符類型和一個(gè)字符串類型,相加會(huì)生成一個(gè)新的字符串類型letletdog:Character=letcow:Character=letdogCow=dog+譯者注原來(lái)的引號(hào)內(nèi)是很可愛的小狗和小牛winos下不支持表情字符所以改成//dogCow現(xiàn)在是詳細(xì)字符,字符串的拼接.求余運(yùn)算abba,多出來(lái)的那部分叫余數(shù)注意:求余運(yùn)算(%)在其他語(yǔ)言也叫取模運(yùn)算.然而嚴(yán)格說(shuō)來(lái),我們看該運(yùn)算符對(duì)負(fù)數(shù)的操作結(jié)果,求余比取模更合適些.我們來(lái)談?wù)勅∮嗍窃趺椿厥?94,49中倍,非常好,1用'*'標(biāo)出9% //等于 ab的結(jié)果計(jì)算了以下等式,并輸出余數(shù)作為結(jié)果a=(b×倍數(shù))+余 當(dāng)倍數(shù)取最大值的時(shí)候,a中94代入等式中,1.9=(4×2)+ 同樣的方法,-94-9% //等于- -94代入等式2是取到的最大整數(shù)1.1.-9=(4×-2)+-余數(shù)是--b求余時(shí)b的符號(hào)會(huì)被忽略.abab的結(jié)果是相同的.浮點(diǎn)數(shù)求余計(jì)算8%2.5//等于 自增和自增運(yùn)算C一樣,Swift11的自增++--的運(yùn)算符.其1.1.vari=2. 現(xiàn)在i++i,i1.實(shí)際上ii=i+1的簡(jiǎn)寫,--iii-1的簡(jiǎn)++--既是前置又是后置運(yùn)算ii++,--i和i--都是有效的寫法我們需要注意的是這些運(yùn)算符修改了i后有一個(gè)返回值.如果你只想修改i的值,那你就可以忽略這個(gè)返回值.但如果你想使用返回值,你就需要留意前置和后置操作的返回值是++前置的時(shí)候,先自増?jiān)俜祷?++后置的時(shí)候,先返回再自增不懂?我們看例子varvara=letba//a和b現(xiàn)在都是letca++//a現(xiàn)在2,但c是a自增前的值上述例子letba,a1a的值.abletca++,a的值,a1.ca1,a除非你需要使用i++的特性,不然推薦你使用++i和--i,因?yàn)橄刃薷暮蠓祷剡@樣的行為單目負(fù)即單目負(fù)號(hào))來(lái)切換letletthree=letminusThree minusThree等于-letplusThree plusThree等于3或"單目負(fù)號(hào)寫在操作數(shù)之前,中間沒有空格.單目正號(hào)+不做任何改變地返回操作數(shù)的值letletminusSix=-letalsoMinusSixminusSixalsoMinusSix等于-+做無(wú)用功,但當(dāng)你在使用單目負(fù)號(hào)來(lái)表達(dá)負(fù)數(shù)時(shí),你可以使用單目正號(hào)來(lái)表達(dá)正數(shù),如此你的代碼會(huì)具有對(duì)稱美.C語(yǔ)言Swift=組合的復(fù)合賦值運(yùn)算符,加賦運(yùn)算+=是其中一個(gè)例子:varvara=a+=2//a現(xiàn)在是a2aa2的簡(jiǎn)寫,一個(gè)加賦運(yùn)算就把加法和賦值兩件事完成了注意:復(fù)合賦值運(yùn)算沒有返回值letba2這類代碼是錯(cuò)誤.這不同于上面提到的自增等于a==bab大于a>b小于a<baa注意:Swift也提供恒等===和不恒等!==這兩個(gè)比較符來(lái)判斷兩個(gè)對(duì)象是否同一個(gè)對(duì)象實(shí)例.細(xì)節(jié)在類與結(jié)構(gòu).TheTheSwiftProgrammingLanguage中文精校2.!=//true,因?yàn)?不等于3.>//true,因?yàn)?大于4.<true15.>=//true,因?yàn)?大于等于6.<=false,因?yàn)?并不小于等于比較運(yùn)算多用于條件語(yǔ)句,if條件letname=ifname=="world"}elseo,println("對(duì)不起name我不認(rèn)識(shí)你6.7.//輸出 o,world",因?yàn)閌name`就是等于if語(yǔ)句,三目條件運(yùn)算的特殊在于它是有三個(gè)操作數(shù)的運(yùn)算符,?答案1:答案2..,1的結(jié)果;如果不成立,返回答案2的結(jié)果.ififquestion:3.else6.這里有個(gè)計(jì)算表格行高的例子.如果有表頭,那行比內(nèi)容高度要高出50像素;如果沒有表頭,只需高出20像素.letletcontentHeight=lethasHeader=letletrowHeight=contentHeight+(hasHeader?50:rowHeightletletcontentHeight=lethasHeader=varrowHeight=ifhasHeaderrowHeight=rowHeight+}elserowHeight=rowHeight+8.9.rowHeight現(xiàn)在是第一段代碼例子使用了三目條件運(yùn)算,所以一行代碼就能讓我們得到正確答案.這比第二段代碼簡(jiǎn)潔得多,無(wú)需將rowHeight定義成變量,因?yàn)樗闹禑o(wú)需在if語(yǔ)句中改變.三目條件運(yùn)算提供有效率且便捷的方式來(lái)表達(dá)二選一的選擇.需要注意的事,過(guò)度使用三目條件運(yùn)算就會(huì)由簡(jiǎn)潔的代碼變成難懂的代碼我們應(yīng)避免在一個(gè)組合語(yǔ)句使用多個(gè)三目條閉區(qū)間運(yùn)算符閉區(qū)間運(yùn)算符a...b定義一個(gè)包含從a到b(包括a和b)的所有值的區(qū)間. 符在迭代一個(gè)區(qū)間的所有值時(shí)是非常有用的,如在for-in循環(huán)中:4.1*5=55.2*5=6.3*5=7.4*5=8.5*5=for-in,半閉區(qū)a..bab但不包括b的區(qū)間.之所以稱為半閉區(qū)間,是因?yàn)樵?5.6.第1個(gè)人7.第2個(gè)人8.第3個(gè)人9.第4個(gè)人注意:4個(gè)元素,0..count3最后一個(gè)元素的下標(biāo)),因?yàn)樗前腴]區(qū)間.關(guān)于數(shù)組,請(qǐng)查閱數(shù)組.邏輯非!aa&&a||邏輯非!a對(duì)一個(gè)布爾值取反,truefalsefalse它是一個(gè)前置運(yùn)算符,需出現(xiàn)在操作數(shù)之前,且不加空格.a,然后我們看以下例letletallowedEntry=if!allowedEntryprintln("ACCESS4.5.//prints"ACCESSif!allowedEntry語(yǔ)句可以讀作如果非alowedentry.",接下一行代碼只有在如果"非allowentry"為true,即allowEntry為false時(shí)被執(zhí)行.在示例代碼中,地選擇布爾常量或變量有助于代碼的可讀性,并且避免使用雙重邏輯非運(yùn)算,或的邏輯語(yǔ)句.邏輯與a&&babtrue時(shí),true只要任意一個(gè)值為false,整個(gè)表達(dá)式的值就為false.事實(shí)上,如果第一個(gè)值為false,那么是不去計(jì)算第二個(gè)值的,因?yàn)樗呀?jīng)不可能影響整個(gè)表達(dá)式的結(jié)果了.這被稱做"短路計(jì)以下例子,只有兩個(gè)值都為值的時(shí)候才允許進(jìn)入letenteredDoorCode=letpassedRetinaScan=ifenteredDoorCode&&passedRetinaScan}elseprintln("ACCESS7.8.//輸出"ACCESS邏輯或a||b|組成的中置運(yùn)算符.它表示了兩個(gè)邏輯表達(dá)式的其中一個(gè)為true,整個(gè)表達(dá)式就為true.同邏輯與運(yùn)算類似,邏輯或也是"短路計(jì)算"的,當(dāng)左端的表達(dá)式為true時(shí),將不計(jì)算右邊的表達(dá)式了,因?yàn)樗豢赡芨淖冋麄€(gè)表達(dá)式的值了.以下示例代碼中,第一個(gè)布爾 hasDoorKey false,但第二個(gè)knowsOverridePasswordtrue,true,于是允許進(jìn)入lethasDoorKey=letknowsOverridePassword=ifhasDoorKey||knowsOverridePassword}elseprintln("ACCESS7.8.//輸出 組合邏1.1.ifenteredDoorCode&&passedRetinaScan||hasDoorKey||assword}elseprintln("ACCESS5.6.//輸出 &&||的復(fù)合邏輯.但無(wú)論怎樣,&&||始終只能操作兩個(gè)值.所以這實(shí)際是三個(gè)簡(jiǎn)單邏輯連續(xù)操作的結(jié)果.我們來(lái)解讀一下:如果我們輸入了正確的并通過(guò)了視網(wǎng)膜掃描;或者我們有一把有效的;又或者我們知道緊急情況下重置的,我們就能把門打開進(jìn)入.前兩種情況,我們都不滿足,所以前兩個(gè)簡(jiǎn)單邏輯的結(jié)果是false,但是我們是知道緊急情況下重置的的,所以整個(gè)復(fù)雜表達(dá)式的值還是true.使用括號(hào)來(lái)明確優(yōu)先級(jí)為了一個(gè)復(fù)雜表達(dá)式更容易讀懂,在合適的地方使用括號(hào)來(lái)明確優(yōu)先級(jí)是很有效的,雖然它并非必要的.在上個(gè)關(guān)于門的權(quán)限的例子中,我們給第一個(gè)部分加個(gè)括號(hào),使用它看起來(lái)1.1.if(enteredDoorCode&&passedRetinaScan)||hasDoorKey||ePassword}elseprintln("ACCESS5.6.//prints 這括號(hào)使得前兩個(gè)值被看成整個(gè)邏輯表達(dá)中獨(dú)立的一個(gè)部分.雖然有括號(hào)和沒括號(hào)的輸出結(jié)果是一樣的,但對(duì)于讀代碼的人來(lái)說(shuō)有括號(hào)的代碼更清晰.可讀性比簡(jiǎn)潔性更重要,請(qǐng)?jiān)诳梢宰屇愦a變清晰地地方加個(gè)括號(hào)吧字符串和字符本篇譯者 ,String是一個(gè)有序的字符集合,例如 o,world","albatross"。Swift字符串通過(guò)SwiftStringCharacter類型提供了一個(gè)快速的,兼容Unicode的方式來(lái)處理代碼C的操作方式相似,輕量并且易讀。字符串連+Swift中其他值一樣,能否更改String類型是一種快速、現(xiàn)代化的字符串實(shí)現(xiàn)。每一個(gè)字符串都是由獨(dú)立編碼的Unicode字符組成,并提供了用于這些字符在不同Unicode表示的支持。值。這使得創(chuàng)建用于展示、和打印的自定義字符串變得輕松自如。注意:注意:Swift的String類型與FoundationNSString類進(jìn)行了無(wú)縫橋接。如果您利用CocoaCocoaTouchFoundationNSStringAPI都可以調(diào)用StringString特性。您也可以在任意要求傳NSStringAPIStringFoundationCocoaStringUsingSwiftwithCocoaandletsomeString="Somestring l 注意:注意:someString常量通過(guò)字符串字面量進(jìn)行初始化,SwiftString\0空字符)、\\(反斜線)、\t水平制表符)、\n換行符)、\r回車符)、雙引號(hào))、\'(單引號(hào))。Unicode\xnnnnUnicode\unnnnnnnnUnicode\Unnnnnnnnnnnnnnnn為八位十六進(jìn)制數(shù)。wiseWords常量包含了兩個(gè)轉(zhuǎn)移特殊字符雙括號(hào)dollarSignblackHeartletwiseWords="\"Imaginationismoreimportantthanknowledge\"-Ei//"Imaginationi

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論