版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、關(guān)于SwiftSwift是一門用于開發(fā)iOS和OSX應(yīng)用程序的新語言,基于C和Object-C,但是沒有C兼容性的限制。Swift采用安全的編程模式,并增加了許多新的現(xiàn)代模式,讓編程更加的容易、靈活,讓編程更加有樂趣。Swift被日前成熟并很受歡迎的Cocoa和CocoaTouch支持,是重新思考如何做軟件開發(fā)的時候了。Swift已經(jīng)經(jīng)過多年的醞釀。蘋果公司通過改進(jìn)現(xiàn)有的編譯器,調(diào)試器和基本框架奠定了Swift的基礎(chǔ)。我們通過自動引用計數(shù)(ARC簡化了存儲管理。我們的框架協(xié)議棧,建立在堅實的基礎(chǔ)框架和Cocoa之上,并且更加新潮和標(biāo)準(zhǔn)化。Objective-C本生已經(jīng)實現(xiàn)模塊化,允許框架使用新
2、的編程語言。由于這個基礎(chǔ),我們現(xiàn)在可以引入新的語言開發(fā)未來的蘋果軟件。Objective-C的程序員對Swift會很容易上手,因為它采用Objective-C相同的命名規(guī)則以及0bjective-C的動態(tài)對象模型。Swift可以無縫的調(diào)用Cocoa框架,并且可以和Objective-C混編。Swift引入了許多新的特性,統(tǒng)一了編程語言程序和而向?qū)ο蟛糠?。Swift對于新接觸的程序員也相當(dāng)友好。它是第一個工業(yè)品質(zhì)系統(tǒng)的編程語言,Swift編寫的程序可以及時看到效果,并且是一門很有趣的腳本語言。Swift無需寫完代碼后再編譯運行。Swift結(jié)合了現(xiàn)代編程語言的思維,廣泛的結(jié)合蘋果工程師的智慧。Sw
3、ift的編譯器正對性能進(jìn)行了優(yōu)化,擴展等無需其它的開銷。它的設(shè)計從“hell。,word”擴展到整個操作系統(tǒng)。所有的一切值得開發(fā)者和蘋果公司對Swift的投資。Swift是一種優(yōu)雅的方式來編寫iOS和OSX應(yīng)用程序,會持續(xù)加入新的功能和特性。我們對Swift充滿信心。我們迫不及待的想看到您用Swift編寫的有趣App。開始Swift之旅依據(jù)傳統(tǒng),一門新語言的第一個程序是在屏幕上打印出“HelloWorld”。用Swift可以在一行代碼中實現(xiàn):println(Hello,world);如果你曾經(jīng)寫過C或則Objective-C,這行Swift語法你看起來或許非常熟悉,這行代碼己經(jīng)是一個完整的程序
4、。你不需要導(dǎo)入一個單獨的庫來處理類似輸入/輸出、字符串處理問題。全局范圍內(nèi)寫的代碼被作為整個程序的入口,因此你不需要一個main函數(shù)。同樣不需要在語句結(jié)尾寫分號(;)。本節(jié)文章展示Swift如何完成各種編程任務(wù),給你足夠的信息來學(xué)習(xí)Swift.如果在學(xué)習(xí)本節(jié)時候你有不明白的地方不用擔(dān)心,整個教程的其余部分會有一個詳細(xì)的說明。注意:為獲得最佳體驗,請下載并在Xcode中打開源碼??梢跃庉嫷拇a,并立即看到結(jié)果。目錄隱藏1簡單的賦值2流程控制ifswitchfor-inwhile3函數(shù)與閉包-4類和對象5枚舉與結(jié)構(gòu)6接口和擴展7泛型簡單的賦彳使用let來定義常量,var定義變量。常量的值無需在編譯
5、時指定,但是至少要賦值一次。這意味著你可以使用常量來命名一個值,你發(fā)現(xiàn)只需一次定義,多個地方使用。varmyVariable=42inyVariable=50letmyConstant=42一個常量或變雖:必須與賦值時擁有相同的類型。因此你不用嚴(yán)格定義類型。提供一個值就可以創(chuàng)建常量或變量,并讓編譯器推斷其類型。在上而例子中,編譯其會推斷myVariable是一個整數(shù)類型,因為其初始化值就是個整數(shù)。如果初始化值沒有提供足夠的信息(或沒有初始化值),可以在變量名后寫類型,以冒號分隔。letiipplicitInteger=70letiipplicitDouble=70.0letexplicitDo
6、uble:Double=70練習(xí):創(chuàng)建一個常量,類型為Float,值為4值永遠(yuǎn)不會隱式轉(zhuǎn)換為另一種類型。如果你需要把一個值轉(zhuǎn)換到不同類型,需要明確的構(gòu)造一個所需類型的實例。letlabel=Thewidthisletwidth=94letwidthLabel=label+String(width)練習(xí):嘗試刪除最后一行的String轉(zhuǎn)換,你會得到什么錯誤?還有更簡單的方法實現(xiàn)在字符串中包含值:以小括號來寫值,并用反斜線()放在小括號之前。例如:letapples=3letoranges=5letappleSummary=have(apples)applesletfruitSummary=hav
7、e(apples+oranges)piecesoffruit練習(xí):字符串中使用()來包含一個浮點數(shù),并包含某人的名字創(chuàng)建一個數(shù)組和字典使用方括號口,訪問其元素則是通過方括號中的索引或鍵。varshoppingList=catfish,water,tulips,bluepaintshoppingList1=bottleofwatervaroccupations=Malcolm:Captain,Kaylee?/:Mechanic,occupationsJayne=PublicRelations要創(chuàng)建一個空的數(shù)組或字典,使用初始化語法:leteipptyArray=String0leteipptyD
8、ictionary=Dictionary()如果類型信息無法推斷,你可以寫空的數(shù)組和空的字典例如你設(shè)置一個知道變量并傳入?yún)?shù)到函數(shù):shoppingList=/Wentshoppingandboughteverything使用if和switch作為條件控制。使用for-in、for、while、do-while作為循環(huán)。小括號不是必須的,但主體的大括號是必需的。letindividualScores=75,43,103,87,12varteamScore=0forscoreinindividualScoresifscore50teamScore+=3)elseteamScore+=1)team
9、Score在if語句中,條件必須是布爾表達(dá)式,這意味著ifscore是錯誤的,不能隱含的與0比較。你可以一起使用if和let來防止值的丟失。這些值是可選的??蛇x值可以包含一個值或包含一個nil來指定值還不存在。寫一個問號“?在類型后表示值是可選的。varoptionalString:String?=HellooptionalString=nilvaroptionalNaroe:String?=JohnAppleseed,zvargreeting=Hello!ifletname=optionalNamegreeting=Hello,(name)練習(xí):改變optionalName為nil會發(fā)生什么
10、?添加一個else子句,如果optionalNam已為nil時設(shè)置一個不同的值如果可選值為n訂,條件判斷為false,大括號中的代碼會被跳過。否則可選值未賦值,并賦值給了一個常量,這樣為賦值變量會到代碼塊中執(zhí)行。switchswitch支持多種數(shù)據(jù)以及多種比較,不限制必須是整數(shù)letvegetable=redpepper7switchvegetablecasecelery:letvegetab1eCoininent=Addsomeraisinsandmakeantsonalog.case/cucumber,,/watercress,/:letvegetab1eCoininent=Thatwou
11、ldmakeagoodteasandwichcaseletxwherex.hasSuffix(,/pepper,):letvegetab1eCoininent=Isitaspicy(x)?default:letvegetableCoininent=Everythingtastesgoodinsoup)練習(xí):嘗試去掉default,看看得到什么錯誤在執(zhí)行匹配的情況后,程序會從switch跳出,而不是繼續(xù)執(zhí)行下一個情況。所以不再需要break跳出switch。for-in可使用for-in來迭代字典中的每個元素,提供一對名字來使用每個鍵值對。1etinterestingNurobers=Prime
12、:2,3,5,7,11,13,Fibonacci:1,1,2,3,5,8,Square:1,4,9,16,25,varlargest=0for(kind,numbers)ininterestingNurobersfornumberinnumbersifnumberlargestlargest=numberlargest練習(xí):添加另一個變量來跟蹤哪個種類中的數(shù)字最大,也就是最大的數(shù)字所在的while使用wh訂e來重復(fù)執(zhí)行代碼塊直到條件改變。循環(huán)的條件可以放在末尾來確保循環(huán)至少執(zhí)行一次。varn=2whilen100n=n*2)nvarro=2doin=m*2m100in你可以在循環(huán)中保持一個索引
13、,通過.來表示索引范圍或明確聲明一個初始值、條件、增量。這兩個循環(huán)做相同的事情:varfirstForLoop=0foriin0.3firstForLoop+=i)firstForLoopvarsecondForLoop=0forvari=0;i(Double,Double,Double)return(3.59,3.69,3.79)getGasPricesO函數(shù)可以接受可變參數(shù)個數(shù),集合到一個數(shù)組中。funcsunOf(numbers:Int)-Intvarsum=0fornumberinnumberssum+二number)returnsum)sunOf0sunOf(42,597,12)1練
14、習(xí):II1編寫一個函數(shù)計算其參數(shù)的平均值L.一一一一一一一一一一一一一一一一一一函數(shù)可以嵌套。內(nèi)嵌函數(shù)可以訪問其立義所在函數(shù)的變量。你可以使用內(nèi)嵌函數(shù)來組織代碼,避免函數(shù)過長和過于復(fù)雜。funcreturnFifteenO-Intvary=10funcadd()y+=5)add()returny)returnFifteenO函數(shù)是第一類型的。這意味著函數(shù)可以返回另一個函數(shù)funcmakeIncrementer()-(Int-Int)funcaddOne(number:Int)-Intreturn1+number)returnaddOne)varincreroent=makeIncremente
15、r0increment(7)一個函數(shù)可以接受其他函數(shù)作為參數(shù)funchasAnyMatches(list:Int,condition:Int-Bool)-Boolforiteminlistifcondition(item)returntrue)returnfalse)func1essThanTen(number:Int)-BoolreturnnumberIntinletresult=3*numberreturnresult)核習(xí):II重寫這個閉包,所有奇數(shù)返回0。寫閉包時有多種選項。當(dāng)一個閉包的類型是己知時,例如代表回調(diào),你可以忽略其參數(shù)和返回值,或兩者。單一語句的閉包可以直接返回值。numb
16、ersm8p(numberin3*number)你可以通過數(shù)字而不是名字來引用一個參數(shù),這對于很短的閉包很有用。一個閉包傳遞其最后一個參數(shù)到函數(shù)作為返回值。sort(l,5,3,12,2)$0$1類禾使用class可以創(chuàng)建一個類。一個屬性的聲明則是在類里作為常量或變量聲明的,除了是在類的上下文中。方法和函數(shù)也是這么寫的。classShapevarnumberOfSides=0funcsinipleDescriptionO-StringreturnAshapewith(numberOfSides)sides)U.通過在類名后加小括號來創(chuàng)建類的實例。使用點語法來訪問實例的屬性和方法。varshap
17、e=Shape0shapenumberOfSides=7varshapeDescription=shapesimpleDescriptionO這里寫的Shape類缺少一些重要的東西:一個構(gòu)造器,用來在創(chuàng)建實例時設(shè)置類??梢允褂胕nit來創(chuàng)建一個構(gòu)造器。classNamedShapevarnumberOfSides:Int=0varname:Stringinit(name:String)=name)funcsimpleDescriptionO-StringreturnAshapewith(nuroberOfSides)sides)注意self用來區(qū)分name屬性和name參數(shù)。構(gòu)造器的生命跟函數(shù)
18、一樣,除了會創(chuàng)建類的實例。每個屬性都需要賦值,無論在聲明里還是在構(gòu)適器里。使用deinit來創(chuàng)建一個析構(gòu)器,來執(zhí)行對象銷毀時的淸理工作。子類名后加父類的名字,以冒號分隔。在繼承根類(類似javaObject類)時無需聲明,所以你可以忽略父類。子類的方法可以通過標(biāo)記override重載父類中的實現(xiàn),而沒有override的會被編譯器看作是錯誤。編譯器也會檢査那些沒有被重載的方法。classSquare:NamedShapevarsideLength:Doubleinit(sideLength:Double,name:String)selfsideLength=sideLengthsuperini
19、t(nain己:name)numberOfSides=4)funcareaO-DoublereturnsideLength*sideLength)overridefuncsiinpleDescriptionO-StringreturnAsquarewithsidesoflength(sideLength)lettest=Square(sideLength:5.2,name:mytestsquare)testareaOtestsimpleDescription0:練習(xí):III:編寫另一個NaroedShape的子類叫做Circle,接受半徑和名字到其構(gòu)造器。實現(xiàn)area和describe方法。屬
20、性可以有g(shù)etter和setter方法classEqui1ateralTriangle:NamedShapevarsideLength:Double二00init(sideLength:Double,name:String)selfsideLength=sideLengthsuperinit(name:name)numberOfSides=3)varperimeter:Doublegetreturn30*sideLength)setsideLength=newValue/30)overridefuncsinipleDescriptionO-StringreturnAnequilateraltr
21、iaglewithsidesoflength(sideLength)vartriangle=EquilateralTriangle(sideLength:3.1,name:atriangle)triangleperimetertriangleperimeter二99trianglesideLength在perimeter的setter中,新的值的名字就是newValue。你可以提供一個在set之后提供一個不沖突的名字。注總EquilateralTriangle的構(gòu)造器有3個不同的步驟:II!調(diào)用超類的構(gòu)造器III!改變超類定義的屬性的值,添加調(diào)用附加的方法.getter,setter也可以在這
22、里I如果你不需要計算屬性,但是仍然使用willSet和didSet提供在設(shè)置值之后執(zhí)行工作。例如,下而的類要保證其三角的邊長等于矩形的變長。classTriangleAndSquarevartriangle:EquilateralTrianglewillSetsquaresideLength=newValuesideLength)varsquare:SquarewillSettrianglesidLength=newValuesideLength)init(size:Double,name:String)square=Square(sideLength:size,name:name)trian
23、gle=Equi1ateralTriangle(sideLength:size,name:name)vartriangleAndSquare=TriangleAndSquare(size:10,name:anothertestshape)triangleAndSquaresquaresideLengthtriangleAndSquaretrianglesideLengthtriangleAndSquare.square=Square(sideLength:50,name:largersquare)triangleAndSquaretrianglesideLength類的方法與函數(shù)有個重要的區(qū)別
24、。函數(shù)的參數(shù)名僅用與函數(shù),但方法的參數(shù)名也可以用于調(diào)用方法(除了第一個參數(shù))。缺省時,一個方法有一個同名的參數(shù),調(diào)用時就是參數(shù)本身。你可以指定第二個名字,在方法內(nèi)部使用。classCountervarcount:Int=0funcincrementBy(amount:Int,nunberOfTiroestimes:Int)count+二amount*times)varcounter=Counter0counterincrementBy(2,numberOfTimes:7)當(dāng)與可選值一起工作時,你可以寫丫到操作符之前類似于方法屬性。如果值在“?之前就己經(jīng)是nil,所有在”T之后的都會自動忽略,而
25、整個表達(dá)式是nil。另外,可選值是未包裝的,所有“?之后的都作為未包裝的值。在兩種情況中,整個表達(dá)式的值是可選值。1etoptionalSquare:Square?=Square(sideLength:2.5,name:optionalsquare)letsideLength=optionalSquare?sideLength使用enuw來創(chuàng)建枚舉。如同類和其他命名類型,枚舉也可以有方法enuinRank:IntcaseAce=1caseTwo,Three,Four,Five,Six,Seven,Eight,Nine,TencaseJack,Queen,KingfuncsimpleDescri
26、ptionO-StringswitchselfcaseAce:returnacecaseJack:returnjackcaseQueen:returnqueen7caseKing:returnkingdefault:returnString(selftoRaw()letace=Rank.AceletaceRawValue=acetoRawO:TOC o 1-5 h ziiii1編寫一個函數(shù),通過通過比較其原始值,比較兩個Rank的值7Ij在如上例子中,原始值的類型是Int所以可以只指定第一個原始值。其后的原始值都是按照順序賦值的。也可以使用字符串或浮點數(shù)作為枚舉的原始值。使用toRaw和fro
27、mRaw函數(shù)可以轉(zhuǎn)換原始值和枚舉值。ifletconvertedRank=Rank.fromRaw(3)letthreeDescription=convertedRanksimpleDescription()枚舉的成員值就是實際值,而不是其他方式寫的原始值。實際上,有些情況是原始值,就是你不提供的時候。enuinSuitcaseSpades,Hearts,Diamonds,ClubsfuncsinipleDescriptionO-StringswitchselfcaseSpades:returnspades7caseHearts:returnheartscaseDiamonds:returnd
28、iamondscaseC1ubs:returnclubs)lethearts=Suit.HeartsletheartsDescription=heartssimpleDEScriptionOTOC o 1-5 h z際習(xí):Iiiiii:添加一個color方法到Suit并在spades和clubs時返回black并且給hearts和diamounds返回red。:LJ注意上而引用Hearts成員的兩種方法:當(dāng)賦值到hearts常量時,枚舉成員Suit.Hearts通過全名引用,因為常量沒有明確的類型。在switch中,枚舉通過.Hearts引用,因為self的值是已知的。你可以在任何時候使用方便
29、的方法。使用struct創(chuàng)建結(jié)構(gòu)體。結(jié)構(gòu)體支持多個與類相同的行為,包括方法和構(gòu)適器。一大重要的區(qū)別是代碼之間的傳遞總是用拷貝(值傳遞),而類則是傳遞引用。structCardvarrank:Rankvarsuit:SuitfuncsimpleDescriptionO-StringreturnThe(ranksimpleDescriptionO)of(suitsimpleDescriptionO)letthreeOfSpades=Card(rank:Three,suit:Spades)letthreeOfSpadesDescription=threeOfSpadessimpleDescripti
30、onO條習(xí):i1111i加方法到Card類來創(chuàng)建一桌的紙牌,每個紙牌都有合并的rank和suite1111一個枚舉的實例成員可以擁有實例的值。相同枚舉成員實例可以有不同的值。你在創(chuàng)建實例時賦值。指定值和原始值的區(qū)別:枚舉的原始值與其實例相同,你在定義枚舉時提供原始值。例如,假設(shè)情況需要從服務(wù)器獲取太陽升起和降落時間。服務(wù)器可以響應(yīng)相同的信息或一些錯誤信息。enuinServerResponsecaseResult(String,String)caseError(String)letsuccess=ServerResponseResult(6:00am,8:09pm)letfailure=Ser
31、verResponseError(Outofcheese)switchsuccesscaseletResult(sunrise,sunset):letServerResponse=Sunriseisat(sunrise)andsunsetisatcaseletError(error):letServerResponse=Failure(error)(sunset)際習(xí):111111;給ServerResponse添加第三種情況來選擇1111J注意日出和日落時間實際上來自于對ServerResponse的部分匹配來選擇的接口和擴展使用protocol來聲明一個接口。protocolExample
32、ProtocolvarsimpleDescription:Stringgetmutatingfuncadjust0)類、枚舉和結(jié)構(gòu)體都可以實現(xiàn)接口。classSimpleClass:ExampleProtocolvarsimpleDescription:String=“AverysimpleclassvaranotherProperty:Int=69105funcadjust0simpleDescription+二Now100%adjusted)vara=SimpleClassOa.adjust0letaDescription=a.sinipleDescriptionstructSimpleS
33、tructure:ExampleProtocolvarsimpleDescription:String=“Asimplestructuremutatingfuncadjust0simpleDescription+二(adjusted)varb=SimpleStructure0badjust0letbDescription=bsinipleDescription:i:iii寫一個實現(xiàn)這個接口的枚舉注意聲明SimpleStructure時候mutating關(guān)鍵字用來標(biāo)記一個會修改結(jié)構(gòu)體的方法。SinpleClass的市明不需要標(biāo)記任何方法因為類中的方法經(jīng)常會修改類。使用extension來為現(xiàn)有的
34、類型添加功能,比如添加一個計算屬性的方法。你可以使用擴展來給任意類型添加協(xié)議,甚至是你從外部庫或者框架中導(dǎo)入的類型。extensionInt:ExanipleProtocolvarsimpleDescription:StringreturnThenunber(self)/?)mutatingfuncadjust0self+二427siippleDescription:練習(xí)iii:給Double類型寫一個擴展,添加absoluteValue功能I你可以像使用其他命名類型一樣使用接口名一一例如,創(chuàng)建一個有不同類型但是都實現(xiàn)一個接口的對象集合。當(dāng)你處理類型是接口的值時,接口外定義的方法不可用。let
35、protocolValue:ExampleProtocol=aprotocolValuesinpleDescription/protocolValueanothErProperty/Uncommenttoseetheerror即使protocolValue變量運用時的類型是simpleClass.編譯器會把它的類型當(dāng)做ExampleProtocolo這表示你不能調(diào)用類在它實現(xiàn)的接口之外實現(xiàn)的方法或者屬性。邂在尖括號里寫一個名字來創(chuàng)建一個泛型函數(shù)或者類型。funcrepeat(item:ItemType,tiroes:Int)-ItemTypevarresult=IteinTypeE0forii
36、n0timesresult+=item)returnresult)repeat(knock,4)你也可以創(chuàng)建泛型類、枚舉和結(jié)構(gòu)體。/ReimplementtheSwiftstandardlibrarysoptionaltypeenunOptionalValuecaseNonecaseSome(T)varpossiblelnteger:OptionalValue=Nonepossiblelnteger=.Some(100)在類型名后而使用udiere來指定一個需求列表一一例如,要限定實現(xiàn)一個協(xié)議的類型,需要限定兩個類型要相同,或者限定一個類必須有一個特定的父類。funcanyConunonEle
37、mentsBoolforlhslteminlhsforrhslteininrhsiflhsltem=rhsltemreturntruereturnfalse)anyCoiranonE1ements(1,2,3,3)嫁萬;iii;修改anyCowiDonElements函數(shù)來創(chuàng)建一個函數(shù),返回一個數(shù)組,內(nèi)容是兩個序列的共有元素。I簡單起見,你可以忽略where,只在冒號后而寫接口或者類名。T:Equatable和TwhewT:Equatable是等價的。TheBasics導(dǎo)航搜索Swift是iOS和OSX應(yīng)用開發(fā)的一門新語言。然而,如果你有C或者Objecti代C開發(fā)經(jīng)臉的話,你會發(fā)現(xiàn)Swift
38、的很多內(nèi)容都是你熟悉的。Swift的類型是在C和Objective-C的基礎(chǔ)上提出的,Int是整型:Double和Float是浮點型:Bool是布爾型:String是字符串。Swift還有兩個有用的集合類型,Array和Dictionary,詳情參見集合類型(待添加鏈接)。就像C語言一樣,Swift使用變量來進(jìn)行存儲并通過變量名來關(guān)聯(lián)值。在Swift中,值不可變的變量有著廣泛的應(yīng)用,它們就是常量,而且比C語言的常量更強大。在Swift中,如果你要處理的值不需要改變,那使用常量可以讓你的代碼更加安全并且更好地表達(dá)你的意圖。除了我們熟悉的類型,Swift還增加了Objective-C中沒有的類型比
39、如元組(Tgle)。元組可以讓你創(chuàng)建或者傳遞一組數(shù)據(jù),比如作為函數(shù)的返回值時,你可以用一個元組可以返回多個值。Swift還增加了可選(Optional)類型,用于處理值缺失的情況??蛇x表示“那兒有一個值,并且它等于x”或者“那兒沒有值”??蛇x有點像在Objective-C中使用rdl,但是它可以用在任何類型上,不僅僅是類??蛇x類型比Objective中的n訂指針更加安全也更具表現(xiàn)力,它是Swift許多強大特性的重要組成部分。Swift是一個類型安全的語言,可選就是一個很好的例子。Swift可以讓你淸楚地知道值的類型。如果你的代碼期望得到一個String,類型安全會阻止你不小心傳入一個Int。你
40、可以在開發(fā)階段盡早發(fā)現(xiàn)并修正錯誤。目錄1常筑和變戢1.1聲明常呈和變雖1.2類型標(biāo)注1.3常呈和變雖的命名L4輸出常呈和變雖2注釋3分號4整數(shù)4.1整數(shù)的邊界IntUlnt5浮點數(shù)6類型安全及類型推7數(shù)字字面雖(Literals)8數(shù)字類型轉(zhuǎn)換8.1整數(shù)轉(zhuǎn)換8.2整數(shù)與浮點數(shù)轉(zhuǎn)換9類型別名(aliases)10布爾值口元組12可選雖12.:Lif語句與強制拆包12.2可選值綁定nil12.4可選呈的隱式拆包13斷聖(Assertions)13.1借助斷言輔助調(diào)試13.2時應(yīng)使用斷曽常量和變量把一個名字(比如maximumNumberOfLoginAttempts或者welcomeMessage
41、)和一個指宦類型的值(比如數(shù)字10或者字符串Hello)關(guān)聯(lián)起來。常量的值一旦設(shè)定就不能改變,而變雖的值可以隨意更改。聲明常量和變量常量和變雖:必須在使用前聲明,用let來聲明常量,用va來聲明變量。下而的例子展示了如何用常量和變雖:來記錄用戶嘗試登錄的次數(shù):letmaximumNuinberOfLoginAttempts=10varcurrentLoginAttempt=0這兩行代碼可以被理解為:“聲明一個名字是maximumNumberOfLoginAttempts的新常量,并給它一個值10。然后,聲明一個名字是currentLoginAttempt的變量并將它的值初始化為0.”在這個例子
42、中,允許的最大嘗試登錄次數(shù)被聲明為一個常量,因為這個值不會改變。當(dāng)前嘗試登錄次數(shù)被聲明為一個變量,因為每次嘗試登錄失敗的時候都需要增加這個值。你可以在一行中聲明多個常量或者多個變量,用逗號隔開:varx=0.0,y=0.0,z=0.0注意:II如果你的代碼中有不需要改變的值,請將它聲明為常雖。只將需要改變的值聲明為變量。U.一一一一一一一一一一一一一一類型標(biāo)注當(dāng)你聲明常量或者變量的時候可以加上類型標(biāo)注,說明常量或者變量中要存儲的值的類型。如果要添加類型標(biāo)注,在常量或者變量名后而加上一個冒號和空格,然后加上類型名稱。這個例子給welcomeMessage變量添加了類型標(biāo)注,表示這個變量可以存儲S
43、tring類型的值:varwelcomeMessage:String聲明中的冒號代表著“是類型”,所以這行代碼可以被理解為:“聲明一個類型為String,名字為welcomeMessage的變雖?!薄邦愋蜑镾tring的意思是“可以存儲任意String類型的值。welcomeMessage變量現(xiàn)在可以被設(shè)置成任意字符串:welcomeMessage=HelloTOC o 1-5 h z獨養(yǎng);:IIIIII一般來說你很少需要寫類型標(biāo)注。如果你在聲明常量或者變量的時候賦了一個初始值,Swift可以推斷出這個常雖:或者7IIIIII變量的類型,詳情參見類型安全和類型推斷(待添加鏈接)。在上而的例子中
44、,沒有給welcomeMessage賦初始值,所II;以添加了一個類型標(biāo)注。:II常量和變量的命名你可以用任何你喜歡的字符作為常量和變量名,包括Unicode字符:letn=3.14159let你好=你好世界let=dogcow常量與變量名不能包含數(shù)學(xué)符號,箭頭,保留的(或者非法的)Unicode碼位,連線與制表符。盡管常量與變量名中可以包含數(shù)字,但是它們不能以數(shù)字打頭。一旦你將常量或者變量聲明為確定的類型,你就不能使用相同的名字再次進(jìn)行聲明,或者以改變其存儲的值為其他類型。同時,你也不能將常量與變量進(jìn)行互轉(zhuǎn)。TOC o 1-5 h zi1主意:如果你需要使用與Swift保留關(guān)鍵字相同的名稱作
45、為常量或者變量名,你可以使用反引號(、)將關(guān)鍵字帀住的方式匚II1將其作為名字使用。無論如何,你應(yīng)當(dāng)避免使用關(guān)鍵字作為常量或變量名,除非你別無選擇。7I你可以更改現(xiàn)有的變量值為其他同類型的值,在下而的例子中,friendlyWelcome的值從Hello!改為了BonjourT:varfriendlyWelcome=Hello!friendlyWe1come=Bonjour!/friendlyWelcomeisnowBonjour!和變量不一樣,常量的值一旦被確定以后就不能更改了。嘗試這樣做會在編譯時報錯:letlanguageName=SwiftlanguageName=Swift+/thi
46、sisacoiupile-tiineerror一languageNamecannotbechanged輸出常量和變量你可以用printin函數(shù)來輸出當(dāng)前常量或變雖的值:println(friendlyWelcome)/printsBonjour!println是一個用來輸出的全局函數(shù),輸出的內(nèi)容會在最后帶換行。如果你用Xcode,printin將會輸出內(nèi)容到“console”而板上。(另一種函數(shù)叫print,唯一區(qū)別是在輸出內(nèi)容最后不會加入換行。)println函數(shù)輸出傳入的String值:printIn(/?Thisisastring)/printsThisisastring像Cocoa里的
47、NSLog函數(shù)一樣,println函數(shù)可以輸出更復(fù)雜的信息。這些信息可以包含當(dāng)前常雖:和變量的值。Swift用字符串插值(stringinterpolation)的方式把常量名或者變量名當(dāng)做占位符加入到長字符串中,Swift會用當(dāng)前常量或變雖:的值替換這些占位符。將常量或變量名放入反斜杠符加一對圓括號中0:printIn(/?ThecurrentvalueoffriendlyWelcomeis(friendlyWelcome)z,)/printsThecurrentvalueoffriendlyWelcomeisBonjourI;字符串插值所有可用的選項在字符串插值這章中講述。請將你的代碼中的
48、非執(zhí)行文本注釋成提示或者筆記以方便你將來閱讀。Swift的編譯器將會在編譯代碼時自動忽略掉注釋部分。Swift中的注釋與C語言的注釋非常相似。單行注釋以雙正斜杠作(/)為起始標(biāo)記:/thisisacomment你也可以進(jìn)行多行注釋,其起始標(biāo)記為單個正斜杠后跟隨一個星號(/*),終止標(biāo)記為一個星號后跟隨單個正斜杠07):/*thisisalsoacommentbutwrittenovermultiplelines*/與c語言多行注釋不同的是,Swift的多行注釋可以嵌套在其它的多行注釋之中。你可以先生成一個多行注釋塊,然后在這個注釋塊之中再嵌套成第二個多行注釋。終止注釋時先插入第二個注釋塊的終止
49、標(biāo)記,然后再插入第一個注釋塊的終止標(biāo)記:/*thisisthestartofthefirstroultilinecomment/*thisisthesecond,nestedmultilineconunent*/thisistheendofthefirstmultilinecomment*/通過運用嵌套多行注釋,你可以快速方便的注釋掉一大段代碼,即使這段代碼之中已經(jīng)含有了多行注釋塊。分號與其他大部分編程語言不同,Swift并不強制要求你在每條語句的結(jié)尾處使用分號(;),當(dāng)然,你也可以按照你自己的習(xí)慣添加分號。有一種情況下必須要用分號,即你打算在同一行內(nèi)寫多條獨立的語句:letcat=;prin
50、tln(cat)/prints整整數(shù)(integer指沒有小數(shù)部分的整數(shù),如42或-23。整數(shù)既可以是有符號的(signed,正數(shù)、零、負(fù)數(shù))也可以是無符號的(unsigned,正數(shù)或零)。Swift提供&16、32、64位形式的有符號及無符號整數(shù)。這些整數(shù)類型遵循C語言的命名規(guī)約,如8位無符號整數(shù)的類型為UInt8,32位有符號整數(shù)的類型為Int320與Swift中的所有類型一樣,這些整數(shù)類型的名稱以大寫字母開頭。整數(shù)的邊界各整數(shù)類型允許的最小值及最大值可通過min及max屬性獲得:letminValue=UInt8.min/minValue等于0,類型為UInt8letmaxValue=U
51、Int8.max/maxValue等于255,類型為UInt8這些屬性的值的類型與對應(yīng)寬度的數(shù)據(jù)類型一致(如上例為UInt8),因此也可以在表達(dá)式中與同類型的其他數(shù)值一起使用。Int絕大多數(shù)情況下,你并不需要自己決宦代碼中要使用的整數(shù)寬度。Swift還提供了一個整數(shù)類型Int,其寬度與當(dāng)前平臺的原生字長(wordsize)一致:在32位平臺,Int與Int32寬度一致。在64位平臺,Int與Int64寬度一致。除非你需要處理特定寬度的整數(shù),在代碼中應(yīng)該只使用Int表示整數(shù)。這樣可以保證一致性及互運算性。即使是在32位平臺,Int也能存儲-2,147,483,648到2,147,483,647的
52、任意數(shù)值,對于很多整數(shù)區(qū)間需求來說.經(jīng)足夠大了。譯注:信蘋果會丟飯碗的UIntSwift還提供了無符號整數(shù)類型UInt,其寬度與當(dāng)前平臺的原生字長一致:在32位平臺,UInt與UInt32寬度一致。在64位平臺,UInt與UInt64寬度一致。:注:只有在特別需要寬度與平臺原生字長一致的時才需要使用無整數(shù)類型UInt。否則應(yīng)使用Int.即使要存儲的值一:TOC o 1-5 h zIIIIII定非負(fù)。總使用Int表示整數(shù)值有助于保證代碼互運算性.避免不同數(shù)據(jù)類型的轉(zhuǎn)換,并且與整數(shù)類型推斷相匹配,II HYPERLINK l bookmark32參見類型安全及類型推斷。i浮點數(shù)浮點數(shù)表示有小數(shù)部分
53、的數(shù)字,例如3.14159、0.1及-273.15。浮點數(shù)類型可以表示的值比整數(shù)類型寬廣得多,也能存儲Int類型能存放的最大及最小值。Swift提供兩種有符號的浮點數(shù)類型:Double表示一個64位浮點數(shù)。在浮點數(shù)值非常大或非常梢確時使用它。Float表示一個32位浮點數(shù)。在浮點數(shù)值不需要64位精度時使用它。TOC o 1-5 h zI1II;注意:Double的稱度為15個I進(jìn)制有效數(shù)字,而Float的梢度只有6位十進(jìn)制有效數(shù)字。應(yīng)根據(jù)代碼所需數(shù)值的:IIII;特點及值域選用合適的浮點數(shù)類型。:II類型安全及類型推斷Swift是一門類型安全的語言。類型安全要求代碼中值的類型非常明確。如果代碼
54、中要求提供String數(shù)據(jù),則不會錯誤地向它傳遞Int數(shù)據(jù)。由于Swift類型安全,它會在編譯代碼時執(zhí)行類型檢查,并將任何類型不匹配的地方標(biāo)為錯誤。這樣可以在開發(fā)過程中盡可能早地發(fā)現(xiàn)并修復(fù)問題。類型檢查有助于在操作不同類型值時避免錯誤。然而,這并不意味著你必須為聲明的每個常量與變量指定類型。如果你不指定所需值的類型,Swift會通過類型推斷(typeinference)求得適當(dāng)?shù)念愋?。類型推斷允許編譯器在編譯代碼時,根據(jù)你提供的值,自動推測出特定表達(dá)式的類型。得益于類型推斷,Swift對類型聲明的需要比起C或O切ective-C語言而言要少很多。常量與變量仍然有明確的類型,但明確指定類型的工作
55、已經(jīng)由編譯器代你完成。類型推斷在你聲明常量或變量的同時提供初始值時尤其有用。通常通過在聲明時賦字而值(literalvalue,或稱“字而量”literal)實現(xiàn)。(字面值指直接出現(xiàn)在源代碼中的值,如下例中的42與3.丄4丄59。)例如,如果將字而值42賦給新的常量,而不明確講它是什么類型,Swift會推斷出你希望該常量為Int類型,因為你初始化時提供的數(shù)字像是個整數(shù)letmeaningOfLife=42/meaningOfLife被推斷屬于Int類型類似地,如果不為浮點數(shù)字而量指定類型,Swift會推斷出你希望創(chuàng)建一個Double變量:letpi=3.14159/pi被推斷屬于Double類
56、型Swift在推斷浮點數(shù)類型時總會選用Double(而不用Float)。如果在表達(dá)式中同時使用整數(shù)與浮點數(shù)字面量,將根據(jù)上下文推斷得到Double類型:letanotherPi=3+0.14159/anotherPi也被推斷為Double類型字而值3沒有明確的類型,自身也不屬于某個明確的類型,但由于加法中出現(xiàn)了浮點數(shù)字而量,因此推斷出合適的輸出類型為Double.數(shù)字字面量(Literals)整數(shù)字而量可以以下而的形式書寫:十進(jìn)制數(shù),無需前綴二進(jìn)制數(shù),以O(shè)b為前綴八進(jìn)制數(shù),以O(shè)o為前綴十六進(jìn)制數(shù),以O(shè)x為前綴下述整數(shù)字而量的值均為十進(jìn)制的17:letdecimallnteger=17=17le
57、tbinaryInteger=OblOOOl/17的二進(jìn)制表示letoctallnteger=0o21/17的八進(jìn)制表示lethexadecimallnteger=Oxll/17的十六進(jìn)制表示浮點數(shù)字而值可以為I進(jìn)制(無需前綴),也可以是I六進(jìn)制(以O(shè)x為前綴)。小數(shù)點兩側(cè)均必須有數(shù)字(或十六進(jìn)制數(shù)字)。還可以有一個可選的幕次(exponent),對十進(jìn)制浮點數(shù)為大寫或小寫的e,對十六進(jìn)制浮點數(shù)為大寫或小寫的P。對幕次為exp的十進(jìn)制數(shù),基數(shù)將乘以lOexp:1.25e2means1.25X102ror125.0.1.25e-2means1.25X10-2ror0.0125.對幕次為exp的I
58、六進(jìn)制數(shù),基數(shù)將乘以2exp:0 xFp2means15X22zor60.0.0 xFp-2means15X2-2ror3.75.下述所有浮點數(shù)字面量的值均為十進(jìn)制的12.1875:letdecimalDouble=12.1875letexponentDouble=1.21875ellethexadecimalDouble=OxC.BpO數(shù)字字而量可以包含額外的格式以便于閱讀。整數(shù)與浮點數(shù)均可以添加多余的零或下劃線以提高可讀性。兩種格式均不會影響字而量的實際值:letpaddedDouble=000123.456letoneMillion=1_000_000letiustOverOneMill
59、ion=1000000.0000001數(shù)字類型轉(zhuǎn)換Int類型應(yīng)作為所有常規(guī)用途的整數(shù)常量及變量的類型,即使它們確實非負(fù)。通常情況下,使用默認(rèn)的整數(shù)類型意味著這些整型常量與變量均可即時互相參與運算,并可與根據(jù)整數(shù)字而值推斷出的類型相匹配。僅當(dāng)手中的任務(wù)必須使用其他整數(shù)類型時才用它們,如外部數(shù)據(jù)源提供寬度明確的數(shù)據(jù),或為了性能、內(nèi)存占用等其他必需優(yōu)化考慮。在這些情況下使用寬度明確的類型有助于發(fā)現(xiàn)偶然的數(shù)值溢出,并還原這些數(shù)據(jù)實際使用時的特點。整數(shù)轉(zhuǎn)換不同類型的整數(shù)常量或變量所能存儲的值域不同。Int8常量或變量能存儲-128到127,而UInt8常量或變量能存儲0到255。無法存放進(jìn)某常量或變量的
60、數(shù)字會報編譯時錯誤:letcannotBeNegative:UInt8=-1/UInt8不能存儲負(fù)數(shù),因此會報錯lettooBig:Int8=Int8.max+1/Int8不能存儲大于其最大值的數(shù)字,/因此這里也會報錯由于不同數(shù)據(jù)類型能存儲的值域不同,在進(jìn)行數(shù)據(jù)轉(zhuǎn)換時需要具體問題具體對待。這種實際選擇的過程可避免隱式轉(zhuǎn)換的問題,并使類型轉(zhuǎn)換的意圖在代碼中明確地展現(xiàn)出來。要將一種數(shù)據(jù)類型轉(zhuǎn)換為另一種,應(yīng)使用現(xiàn)有值初始化一個所需類型的新數(shù)。下例中,常量twoThousand的類型為UIntl6,而常量one的類型為UInt8。它們無法直接相加,因為類型不同。因此,本例將調(diào)用UIntl6(one)新
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 技術(shù)創(chuàng)新與養(yǎng)老行業(yè)的融合
- 個人固定資產(chǎn)借款合同范文
- 土方運輸承包合同范本
- 農(nóng)產(chǎn)品經(jīng)銷合同書
- 牛羊肉購銷合同協(xié)議書模板范本
- 凈水器購銷合同模板
- 合同范本產(chǎn)品銷售合同
- 合同違約責(zé)任條款
- 煤礦井下飛行巡檢機器人的研究與應(yīng)用展望
- 安裝合同范本 標(biāo)準(zhǔn)版
- 《財務(wù)管理學(xué)(第10版)》課件 第5、6章 長期籌資方式、資本結(jié)構(gòu)決策
- 房屋永久居住權(quán)合同模板
- 醫(yī)院納入定點后使用醫(yī)療保障基金的預(yù)測性分析報告
- 初中英語不規(guī)則動詞表(譯林版-中英)
- 2024年3月四川省公務(wù)員考試面試題及參考答案
- 新生兒黃疸早期識別課件
- 醫(yī)藥營銷團(tuán)隊建設(shè)與管理
- 二年級數(shù)學(xué)上冊口算題100道(全冊完整)
- 冷軋工程專業(yè)詞匯匯編注音版
- 小升初幼升小擇校畢業(yè)升學(xué)兒童簡歷
- 第一單元(金融知識進(jìn)課堂)課件
評論
0/150
提交評論