Swift編程語(yǔ)言中文教程_第1頁(yè)
Swift編程語(yǔ)言中文教程_第2頁(yè)
Swift編程語(yǔ)言中文教程_第3頁(yè)
Swift編程語(yǔ)言中文教程_第4頁(yè)
Swift編程語(yǔ)言中文教程_第5頁(yè)
已閱讀5頁(yè),還剩113頁(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)介

1、關(guān)于SwiftSwift是一門用于開(kāi)發(fā)iOS和OSX應(yīng)用程序的新語(yǔ)言,基于C和Object-C,但是沒(méi)有C兼容性的限制。Swift采用安全的編程模式,并增加了許多新的現(xiàn)代模式,讓編程更加的容易、靈活,讓編程更加有樂(lè)趣。Swift被日前成熟并很受歡迎的Cocoa和CocoaTouch支持,是重新思考如何做軟件開(kāi)發(fā)的時(shí)候了。Swift已經(jīng)經(jīng)過(guò)多年的醞釀。蘋(píng)果公司通過(guò)改進(jìn)現(xiàn)有的編譯器,調(diào)試器和基本框架奠定了Swift的基礎(chǔ)。我們通過(guò)自動(dòng)引用計(jì)數(shù)(ARC簡(jiǎn)化了存儲(chǔ)管理。我們的框架協(xié)議棧,建立在堅(jiān)實(shí)的基礎(chǔ)框架和Cocoa之上,并且更加新潮和標(biāo)準(zhǔn)化。Objective-C本生已經(jīng)實(shí)現(xiàn)模塊化,允許框架使用新

2、的編程語(yǔ)言。由于這個(gè)基礎(chǔ),我們現(xiàn)在可以引入新的語(yǔ)言開(kāi)發(fā)未來(lái)的蘋(píng)果軟件。Objective-C的程序員對(duì)Swift會(huì)很容易上手,因?yàn)樗捎肙bjective-C相同的命名規(guī)則以及0bjective-C的動(dòng)態(tài)對(duì)象模型。Swift可以無(wú)縫的調(diào)用Cocoa框架,并且可以和Objective-C混編。Swift引入了許多新的特性,統(tǒng)一了編程語(yǔ)言程序和而向?qū)ο蟛糠?。Swift對(duì)于新接觸的程序員也相當(dāng)友好。它是第一個(gè)工業(yè)品質(zhì)系統(tǒng)的編程語(yǔ)言,Swift編寫(xiě)的程序可以及時(shí)看到效果,并且是一門很有趣的腳本語(yǔ)言。Swift無(wú)需寫(xiě)完代碼后再編譯運(yùn)行。Swift結(jié)合了現(xiàn)代編程語(yǔ)言的思維,廣泛的結(jié)合蘋(píng)果工程師的智慧。Sw

3、ift的編譯器正對(duì)性能進(jìn)行了優(yōu)化,擴(kuò)展等無(wú)需其它的開(kāi)銷。它的設(shè)計(jì)從“hell。,word”擴(kuò)展到整個(gè)操作系統(tǒng)。所有的一切值得開(kāi)發(fā)者和蘋(píng)果公司對(duì)Swift的投資。Swift是一種優(yōu)雅的方式來(lái)編寫(xiě)iOS和OSX應(yīng)用程序,會(huì)持續(xù)加入新的功能和特性。我們對(duì)Swift充滿信心。我們迫不及待的想看到您用Swift編寫(xiě)的有趣App。開(kāi)始Swift之旅依據(jù)傳統(tǒng),一門新語(yǔ)言的第一個(gè)程序是在屏幕上打印出“HelloWorld”。用Swift可以在一行代碼中實(shí)現(xiàn):println(Hello,world);如果你曾經(jīng)寫(xiě)過(guò)C或則Objective-C,這行Swift語(yǔ)法你看起來(lái)或許非常熟悉,這行代碼己經(jīng)是一個(gè)完整的程序

4、。你不需要導(dǎo)入一個(gè)單獨(dú)的庫(kù)來(lái)處理類似輸入/輸出、字符串處理問(wèn)題。全局范圍內(nèi)寫(xiě)的代碼被作為整個(gè)程序的入口,因此你不需要一個(gè)main函數(shù)。同樣不需要在語(yǔ)句結(jié)尾寫(xiě)分號(hào)(;)。本節(jié)文章展示Swift如何完成各種編程任務(wù),給你足夠的信息來(lái)學(xué)習(xí)Swift.如果在學(xué)習(xí)本節(jié)時(shí)候你有不明白的地方不用擔(dān)心,整個(gè)教程的其余部分會(huì)有一個(gè)詳細(xì)的說(shuō)明。注意:為獲得最佳體驗(yàn),請(qǐng)下載并在Xcode中打開(kāi)源碼??梢跃庉嫷拇a,并立即看到結(jié)果。目錄隱藏1簡(jiǎn)單的賦值2流程控制ifswitchfor-inwhile3函數(shù)與閉包-4類和對(duì)象5枚舉與結(jié)構(gòu)6接口和擴(kuò)展7泛型簡(jiǎn)單的賦彳使用let來(lái)定義常量,var定義變量。常量的值無(wú)需在編譯

5、時(shí)指定,但是至少要賦值一次。這意味著你可以使用常量來(lái)命名一個(gè)值,你發(fā)現(xiàn)只需一次定義,多個(gè)地方使用。varmyVariable=42inyVariable=50letmyConstant=42一個(gè)常量或變雖:必須與賦值時(shí)擁有相同的類型。因此你不用嚴(yán)格定義類型。提供一個(gè)值就可以創(chuàng)建常量或變量,并讓編譯器推斷其類型。在上而例子中,編譯其會(huì)推斷myVariable是一個(gè)整數(shù)類型,因?yàn)槠涑跏蓟稻褪莻€(gè)整數(shù)。如果初始化值沒(méi)有提供足夠的信息(或沒(méi)有初始化值),可以在變量名后寫(xiě)類型,以冒號(hào)分隔。letiipplicitInteger=70letiipplicitDouble=70.0letexplicitDo

6、uble:Double=70練習(xí):創(chuàng)建一個(gè)常量,類型為Float,值為4值永遠(yuǎn)不會(huì)隱式轉(zhuǎn)換為另一種類型。如果你需要把一個(gè)值轉(zhuǎn)換到不同類型,需要明確的構(gòu)造一個(gè)所需類型的實(shí)例。letlabel=Thewidthisletwidth=94letwidthLabel=label+String(width)練習(xí):嘗試刪除最后一行的String轉(zhuǎn)換,你會(huì)得到什么錯(cuò)誤?還有更簡(jiǎn)單的方法實(shí)現(xiàn)在字符串中包含值:以小括號(hào)來(lái)寫(xiě)值,并用反斜線()放在小括號(hào)之前。例如:letapples=3letoranges=5letappleSummary=have(apples)applesletfruitSummary=hav

7、e(apples+oranges)piecesoffruit練習(xí):字符串中使用()來(lái)包含一個(gè)浮點(diǎn)數(shù),并包含某人的名字創(chuàng)建一個(gè)數(shù)組和字典使用方括號(hào)口,訪問(wèn)其元素則是通過(guò)方括號(hào)中的索引或鍵。varshoppingList=catfish,water,tulips,bluepaintshoppingList1=bottleofwatervaroccupations=Malcolm:Captain,Kaylee?/:Mechanic,occupationsJayne=PublicRelations要?jiǎng)?chuàng)建一個(gè)空的數(shù)組或字典,使用初始化語(yǔ)法:leteipptyArray=String0leteipptyD

8、ictionary=Dictionary()如果類型信息無(wú)法推斷,你可以寫(xiě)空的數(shù)組和空的字典例如你設(shè)置一個(gè)知道變量并傳入?yún)?shù)到函數(shù):shoppingList=/Wentshoppingandboughteverything使用if和switch作為條件控制。使用for-in、for、while、do-while作為循環(huán)。小括號(hào)不是必須的,但主體的大括號(hào)是必需的。letindividualScores=75,43,103,87,12varteamScore=0forscoreinindividualScoresifscore50teamScore+=3)elseteamScore+=1)team

9、Score在if語(yǔ)句中,條件必須是布爾表達(dá)式,這意味著ifscore是錯(cuò)誤的,不能隱含的與0比較。你可以一起使用if和let來(lái)防止值的丟失。這些值是可選的??蛇x值可以包含一個(gè)值或包含一個(gè)nil來(lái)指定值還不存在。寫(xiě)一個(gè)問(wèn)號(hào)“?在類型后表示值是可選的。varoptionalString:String?=HellooptionalString=nilvaroptionalNaroe:String?=JohnAppleseed,zvargreeting=Hello!ifletname=optionalNamegreeting=Hello,(name)練習(xí):改變optionalName為nil會(huì)發(fā)生什么

10、?添加一個(gè)else子句,如果optionalNam已為nil時(shí)設(shè)置一個(gè)不同的值如果可選值為n訂,條件判斷為false,大括號(hào)中的代碼會(huì)被跳過(guò)。否則可選值未賦值,并賦值給了一個(gè)常量,這樣為賦值變量會(huì)到代碼塊中執(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,看看得到什么錯(cuò)誤在執(zhí)行匹配的情況后,程序會(huì)從switch跳出,而不是繼續(xù)執(zhí)行下一個(gè)情況。所以不再需要break跳出switch。for-in可使用for-in來(lái)迭代字典中的每個(gè)元素,提供一對(duì)名字來(lái)使用每個(gè)鍵值對(duì)。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í):添加另一個(gè)變量來(lái)跟蹤哪個(gè)種類中的數(shù)字最大,也就是最大的數(shù)字所在的while使用wh訂e來(lái)重復(fù)執(zhí)行代碼塊直到條件改變。循環(huán)的條件可以放在末尾來(lái)確保循環(huán)至少執(zhí)行一次。varn=2whilen100n=n*2)nvarro=2doin=m*2m100in你可以在循環(huán)中保持一個(gè)索引

13、,通過(guò).來(lái)表示索引范圍或明確聲明一個(gè)初始值、條件、增量。這兩個(gè)循環(huán)做相同的事情:varfirstForLoop=0foriin0.3firstForLoop+=i)firstForLoopvarsecondForLoop=0forvari=0;i(Double,Double,Double)return(3.59,3.69,3.79)getGasPricesO函數(shù)可以接受可變參數(shù)個(gè)數(shù),集合到一個(gè)數(shù)組中。funcsunOf(numbers:Int)-Intvarsum=0fornumberinnumberssum+二number)returnsum)sunOf0sunOf(42,597,12)1練

14、習(xí):II1編寫(xiě)一個(gè)函數(shù)計(jì)算其參數(shù)的平均值L.一一一一一一一一一一一一一一一一一一函數(shù)可以嵌套。內(nèi)嵌函數(shù)可以訪問(wèn)其立義所在函數(shù)的變量。你可以使用內(nèi)嵌函數(shù)來(lái)組織代碼,避免函數(shù)過(guò)長(zhǎng)和過(guò)于復(fù)雜。funcreturnFifteenO-Intvary=10funcadd()y+=5)add()returny)returnFifteenO函數(shù)是第一類型的。這意味著函數(shù)可以返回另一個(gè)函數(shù)funcmakeIncrementer()-(Int-Int)funcaddOne(number:Int)-Intreturn1+number)returnaddOne)varincreroent=makeIncremente

15、r0increment(7)一個(gè)函數(shù)可以接受其他函數(shù)作為參數(shù)funchasAnyMatches(list:Int,condition:Int-Bool)-Boolforiteminlistifcondition(item)returntrue)returnfalse)func1essThanTen(number:Int)-BoolreturnnumberIntinletresult=3*numberreturnresult)核習(xí):II重寫(xiě)這個(gè)閉包,所有奇數(shù)返回0。寫(xiě)閉包時(shí)有多種選項(xiàng)。當(dāng)一個(gè)閉包的類型是己知時(shí),例如代表回調(diào),你可以忽略其參數(shù)和返回值,或兩者。單一語(yǔ)句的閉包可以直接返回值。numb

16、ersm8p(numberin3*number)你可以通過(guò)數(shù)字而不是名字來(lái)引用一個(gè)參數(shù),這對(duì)于很短的閉包很有用。一個(gè)閉包傳遞其最后一個(gè)參數(shù)到函數(shù)作為返回值。sort(l,5,3,12,2)$0$1類禾使用class可以創(chuàng)建一個(gè)類。一個(gè)屬性的聲明則是在類里作為常量或變量聲明的,除了是在類的上下文中。方法和函數(shù)也是這么寫(xiě)的。classShapevarnumberOfSides=0funcsinipleDescriptionO-StringreturnAshapewith(numberOfSides)sides)U.通過(guò)在類名后加小括號(hào)來(lái)創(chuàng)建類的實(shí)例。使用點(diǎn)語(yǔ)法來(lái)訪問(wèn)實(shí)例的屬性和方法。varshap

17、e=Shape0shapenumberOfSides=7varshapeDescription=shapesimpleDescriptionO這里寫(xiě)的Shape類缺少一些重要的東西:一個(gè)構(gòu)造器,用來(lái)在創(chuàng)建實(shí)例時(shí)設(shè)置類??梢允褂胕nit來(lái)創(chuàng)建一個(gè)構(gòu)造器。classNamedShapevarnumberOfSides:Int=0varname:Stringinit(name:String)=name)funcsimpleDescriptionO-StringreturnAshapewith(nuroberOfSides)sides)注意self用來(lái)區(qū)分name屬性和name參數(shù)。構(gòu)造器的生命跟函數(shù)

18、一樣,除了會(huì)創(chuàng)建類的實(shí)例。每個(gè)屬性都需要賦值,無(wú)論在聲明里還是在構(gòu)適器里。使用deinit來(lái)創(chuàng)建一個(gè)析構(gòu)器,來(lái)執(zhí)行對(duì)象銷毀時(shí)的淸理工作。子類名后加父類的名字,以冒號(hào)分隔。在繼承根類(類似javaObject類)時(shí)無(wú)需聲明,所以你可以忽略父類。子類的方法可以通過(guò)標(biāo)記override重載父類中的實(shí)現(xiàn),而沒(méi)有override的會(huì)被編譯器看作是錯(cuò)誤。編譯器也會(huì)檢査那些沒(méi)有被重載的方法。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:編寫(xiě)另一個(gè)NaroedShape的子類叫做Circle,接受半徑和名字到其構(gòu)造器。實(shí)現(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。你可以提供一個(gè)在set之后提供一個(gè)不沖突的名字。注總EquilateralTriangle的構(gòu)造器有3個(gè)不同的步驟:II!調(diào)用超類的構(gòu)造器III!改變超類定義的屬性的值,添加調(diào)用附加的方法.getter,setter也可以在這

22、里I如果你不需要計(jì)算屬性,但是仍然使用willSet和didSet提供在設(shè)置值之后執(zhí)行工作。例如,下而的類要保證其三角的邊長(zhǎng)等于矩形的變長(zhǎng)。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ù)有個(gè)重要的區(qū)別

24、。函數(shù)的參數(shù)名僅用與函數(shù),但方法的參數(shù)名也可以用于調(diào)用方法(除了第一個(gè)參數(shù))。缺省時(shí),一個(gè)方法有一個(gè)同名的參數(shù),調(diào)用時(shí)就是參數(shù)本身。你可以指定第二個(gè)名字,在方法內(nèi)部使用。classCountervarcount:Int=0funcincrementBy(amount:Int,nunberOfTiroestimes:Int)count+二amount*times)varcounter=Counter0counterincrementBy(2,numberOfTimes:7)當(dāng)與可選值一起工作時(shí),你可以寫(xiě)丫到操作符之前類似于方法屬性。如果值在“?之前就己經(jīng)是nil,所有在”T之后的都會(huì)自動(dòng)忽略,而

25、整個(gè)表達(dá)式是nil。另外,可選值是未包裝的,所有“?之后的都作為未包裝的值。在兩種情況中,整個(gè)表達(dá)式的值是可選值。1etoptionalSquare:Square?=Square(sideLength:2.5,name:optionalsquare)letsideLength=optionalSquare?sideLength使用enuw來(lái)創(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編寫(xiě)一個(gè)函數(shù),通過(guò)通過(guò)比較其原始值,比較兩個(gè)Rank的值7Ij在如上例子中,原始值的類型是Int所以可以只指定第一個(gè)原始值。其后的原始值都是按照順序賦值的。也可以使用字符串或浮點(diǎn)數(shù)作為枚舉的原始值。使用toRaw和fro

27、mRaw函數(shù)可以轉(zhuǎn)換原始值和枚舉值。ifletconvertedRank=Rank.fromRaw(3)letthreeDescription=convertedRanksimpleDescription()枚舉的成員值就是實(shí)際值,而不是其他方式寫(xiě)的原始值。實(shí)際上,有些情況是原始值,就是你不提供的時(shí)候。enuinSuitcaseSpades,Hearts,Diamonds,ClubsfuncsinipleDescriptionO-StringswitchselfcaseSpades:returnspades7caseHearts:returnheartscaseDiamonds:returnd

28、iamondscaseC1ubs:returnclubs)lethearts=Suit.HeartsletheartsDescription=heartssimpleDEScriptionOTOC o 1-5 h z際習(xí):Iiiiii:添加一個(gè)color方法到Suit并在spades和clubs時(shí)返回black并且給hearts和diamounds返回red。:LJ注意上而引用Hearts成員的兩種方法:當(dāng)賦值到hearts常量時(shí),枚舉成員Suit.Hearts通過(guò)全名引用,因?yàn)槌A繘](méi)有明確的類型。在switch中,枚舉通過(guò).Hearts引用,因?yàn)閟elf的值是已知的。你可以在任何時(shí)候使用方便

29、的方法。使用struct創(chuàng)建結(jié)構(gòu)體。結(jié)構(gòu)體支持多個(gè)與類相同的行為,包括方法和構(gòu)適器。一大重要的區(qū)別是代碼之間的傳遞總是用拷貝(值傳遞),而類則是傳遞引用。structCardvarrank:Rankvarsuit:SuitfuncsimpleDescriptionO-StringreturnThe(ranksimpleDescriptionO)of(suitsimpleDescriptionO)letthreeOfSpades=Card(rank:Three,suit:Spades)letthreeOfSpadesDescription=threeOfSpadessimpleDescripti

30、onO條習(xí):i1111i加方法到Card類來(lái)創(chuàng)建一桌的紙牌,每個(gè)紙牌都有合并的rank和suite1111一個(gè)枚舉的實(shí)例成員可以擁有實(shí)例的值。相同枚舉成員實(shí)例可以有不同的值。你在創(chuàng)建實(shí)例時(shí)賦值。指定值和原始值的區(qū)別:枚舉的原始值與其實(shí)例相同,你在定義枚舉時(shí)提供原始值。例如,假設(shè)情況需要從服務(wù)器獲取太陽(yáng)升起和降落時(shí)間。服務(wù)器可以響應(yīng)相同的信息或一些錯(cuò)誤信息。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添加第三種情況來(lái)選擇1111J注意日出和日落時(shí)間實(shí)際上來(lái)自于對(duì)ServerResponse的部分匹配來(lái)選擇的接口和擴(kuò)展使用protocol來(lái)聲明一個(gè)接口。protocolExample

32、ProtocolvarsimpleDescription:Stringgetmutatingfuncadjust0)類、枚舉和結(jié)構(gòu)體都可以實(shí)現(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ě)一個(gè)實(shí)現(xiàn)這個(gè)接口的枚舉注意聲明SimpleStructure時(shí)候mutating關(guān)鍵字用來(lái)標(biāo)記一個(gè)會(huì)修改結(jié)構(gòu)體的方法。SinpleClass的市明不需要標(biāo)記任何方法因?yàn)轭愔械姆椒ń?jīng)常會(huì)修改類。使用extension來(lái)為現(xiàn)有的

34、類型添加功能,比如添加一個(gè)計(jì)算屬性的方法。你可以使用擴(kuò)展來(lái)給任意類型添加協(xié)議,甚至是你從外部庫(kù)或者框架中導(dǎo)入的類型。extensionInt:ExanipleProtocolvarsimpleDescription:StringreturnThenunber(self)/?)mutatingfuncadjust0self+二427siippleDescription:練習(xí)iii:給Double類型寫(xiě)一個(gè)擴(kuò)展,添加absoluteValue功能I你可以像使用其他命名類型一樣使用接口名一一例如,創(chuàng)建一個(gè)有不同類型但是都實(shí)現(xiàn)一個(gè)接口的對(duì)象集合。當(dāng)你處理類型是接口的值時(shí),接口外定義的方法不可用。let

35、protocolValue:ExampleProtocol=aprotocolValuesinpleDescription/protocolValueanothErProperty/Uncommenttoseetheerror即使protocolValue變量運(yùn)用時(shí)的類型是simpleClass.編譯器會(huì)把它的類型當(dāng)做ExampleProtocolo這表示你不能調(diào)用類在它實(shí)現(xiàn)的接口之外實(shí)現(xiàn)的方法或者屬性。邂在尖括號(hào)里寫(xiě)一個(gè)名字來(lái)創(chuàng)建一個(gè)泛型函數(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來(lái)指定一個(gè)需求列表一一例如,要限定實(shí)現(xiàn)一個(gè)協(xié)議的類型,需要限定兩個(gè)類型要相同,或者限定一個(gè)類必須有一個(gè)特定的父類。funcanyConunonEle

37、mentsBoolforlhslteminlhsforrhslteininrhsiflhsltem=rhsltemreturntruereturnfalse)anyCoiranonE1ements(1,2,3,3)嫁萬(wàn);iii;修改anyCowiDonElements函數(shù)來(lái)創(chuàng)建一個(gè)函數(shù),返回一個(gè)數(shù)組,內(nèi)容是兩個(gè)序列的共有元素。I簡(jiǎn)單起見(jiàn),你可以忽略where,只在冒號(hào)后而寫(xiě)接口或者類名。T:Equatable和TwhewT:Equatable是等價(jià)的。TheBasics導(dǎo)航搜索Swift是iOS和OSX應(yīng)用開(kāi)發(fā)的一門新語(yǔ)言。然而,如果你有C或者Objecti代C開(kāi)發(fā)經(jīng)臉的話,你會(huì)發(fā)現(xiàn)Swift

38、的很多內(nèi)容都是你熟悉的。Swift的類型是在C和Objective-C的基礎(chǔ)上提出的,Int是整型:Double和Float是浮點(diǎn)型:Bool是布爾型:String是字符串。Swift還有兩個(gè)有用的集合類型,Array和Dictionary,詳情參見(jiàn)集合類型(待添加鏈接)。就像C語(yǔ)言一樣,Swift使用變量來(lái)進(jìn)行存儲(chǔ)并通過(guò)變量名來(lái)關(guān)聯(lián)值。在Swift中,值不可變的變量有著廣泛的應(yīng)用,它們就是常量,而且比C語(yǔ)言的常量更強(qiáng)大。在Swift中,如果你要處理的值不需要改變,那使用常量可以讓你的代碼更加安全并且更好地表達(dá)你的意圖。除了我們熟悉的類型,Swift還增加了Objective-C中沒(méi)有的類型比

39、如元組(Tgle)。元組可以讓你創(chuàng)建或者傳遞一組數(shù)據(jù),比如作為函數(shù)的返回值時(shí),你可以用一個(gè)元組可以返回多個(gè)值。Swift還增加了可選(Optional)類型,用于處理值缺失的情況??蛇x表示“那兒有一個(gè)值,并且它等于x”或者“那兒沒(méi)有值”??蛇x有點(diǎn)像在Objective-C中使用rdl,但是它可以用在任何類型上,不僅僅是類??蛇x類型比Objective中的n訂指針更加安全也更具表現(xiàn)力,它是Swift許多強(qiáng)大特性的重要組成部分。Swift是一個(gè)類型安全的語(yǔ)言,可選就是一個(gè)很好的例子。Swift可以讓你淸楚地知道值的類型。如果你的代碼期望得到一個(gè)String,類型安全會(huì)阻止你不小心傳入一個(gè)Int。你

40、可以在開(kāi)發(fā)階段盡早發(fā)現(xiàn)并修正錯(cuò)誤。目錄1常筑和變戢1.1聲明常呈和變雖1.2類型標(biāo)注1.3常呈和變雖的命名L4輸出常呈和變雖2注釋3分號(hào)4整數(shù)4.1整數(shù)的邊界IntUlnt5浮點(diǎn)數(shù)6類型安全及類型推7數(shù)字字面雖(Literals)8數(shù)字類型轉(zhuǎn)換8.1整數(shù)轉(zhuǎn)換8.2整數(shù)與浮點(diǎn)數(shù)轉(zhuǎn)換9類型別名(aliases)10布爾值口元組12可選雖12.:Lif語(yǔ)句與強(qiáng)制拆包12.2可選值綁定nil12.4可選呈的隱式拆包13斷聖(Assertions)13.1借助斷言輔助調(diào)試13.2時(shí)應(yīng)使用斷曽常量和變量把一個(gè)名字(比如maximumNumberOfLoginAttempts或者welcomeMessage

41、)和一個(gè)指宦類型的值(比如數(shù)字10或者字符串Hello)關(guān)聯(lián)起來(lái)。常量的值一旦設(shè)定就不能改變,而變雖的值可以隨意更改。聲明常量和變量常量和變雖:必須在使用前聲明,用let來(lái)聲明常量,用va來(lái)聲明變量。下而的例子展示了如何用常量和變雖:來(lái)記錄用戶嘗試登錄的次數(shù):letmaximumNuinberOfLoginAttempts=10varcurrentLoginAttempt=0這兩行代碼可以被理解為:“聲明一個(gè)名字是maximumNumberOfLoginAttempts的新常量,并給它一個(gè)值10。然后,聲明一個(gè)名字是currentLoginAttempt的變量并將它的值初始化為0.”在這個(gè)例子

42、中,允許的最大嘗試登錄次數(shù)被聲明為一個(gè)常量,因?yàn)檫@個(gè)值不會(huì)改變。當(dāng)前嘗試登錄次數(shù)被聲明為一個(gè)變量,因?yàn)槊看螄L試登錄失敗的時(shí)候都需要增加這個(gè)值。你可以在一行中聲明多個(gè)常量或者多個(gè)變量,用逗號(hào)隔開(kāi):varx=0.0,y=0.0,z=0.0注意:II如果你的代碼中有不需要改變的值,請(qǐng)將它聲明為常雖。只將需要改變的值聲明為變量。U.一一一一一一一一一一一一一一類型標(biāo)注當(dāng)你聲明常量或者變量的時(shí)候可以加上類型標(biāo)注,說(shuō)明常量或者變量中要存儲(chǔ)的值的類型。如果要添加類型標(biāo)注,在常量或者變量名后而加上一個(gè)冒號(hào)和空格,然后加上類型名稱。這個(gè)例子給welcomeMessage變量添加了類型標(biāo)注,表示這個(gè)變量可以存儲(chǔ)S

43、tring類型的值:varwelcomeMessage:String聲明中的冒號(hào)代表著“是類型”,所以這行代碼可以被理解為:“聲明一個(gè)類型為String,名字為welcomeMessage的變雖。”“類型為String的意思是“可以存儲(chǔ)任意String類型的值。welcomeMessage變量現(xiàn)在可以被設(shè)置成任意字符串:welcomeMessage=HelloTOC o 1-5 h z獨(dú)養(yǎng);:IIIIII一般來(lái)說(shuō)你很少需要寫(xiě)類型標(biāo)注。如果你在聲明常量或者變量的時(shí)候賦了一個(gè)初始值,Swift可以推斷出這個(gè)常雖:或者7IIIIII變量的類型,詳情參見(jiàn)類型安全和類型推斷(待添加鏈接)。在上而的例子中

44、,沒(méi)有給welcomeMessage賦初始值,所II;以添加了一個(gè)類型標(biāo)注。:II常量和變量的命名你可以用任何你喜歡的字符作為常量和變量名,包括Unicode字符:letn=3.14159let你好=你好世界let=dogcow常量與變量名不能包含數(shù)學(xué)符號(hào),箭頭,保留的(或者非法的)Unicode碼位,連線與制表符。盡管常量與變量名中可以包含數(shù)字,但是它們不能以數(shù)字打頭。一旦你將常量或者變量聲明為確定的類型,你就不能使用相同的名字再次進(jìn)行聲明,或者以改變其存儲(chǔ)的值為其他類型。同時(shí),你也不能將常量與變量進(jìn)行互轉(zhuǎn)。TOC o 1-5 h zi1主意:如果你需要使用與Swift保留關(guān)鍵字相同的名稱作

45、為常量或者變量名,你可以使用反引號(hào)(、)將關(guān)鍵字帀住的方式匚II1將其作為名字使用。無(wú)論如何,你應(yīng)當(dāng)避免使用關(guān)鍵字作為常量或變量名,除非你別無(wú)選擇。7I你可以更改現(xiàn)有的變量值為其他同類型的值,在下而的例子中,friendlyWelcome的值從Hello!改為了BonjourT:varfriendlyWelcome=Hello!friendlyWe1come=Bonjour!/friendlyWelcomeisnowBonjour!和變量不一樣,常量的值一旦被確定以后就不能更改了。嘗試這樣做會(huì)在編譯時(shí)報(bào)錯(cuò):letlanguageName=SwiftlanguageName=Swift+/thi

46、sisacoiupile-tiineerror一languageNamecannotbechanged輸出常量和變量你可以用printin函數(shù)來(lái)輸出當(dāng)前常量或變雖的值:println(friendlyWelcome)/printsBonjour!println是一個(gè)用來(lái)輸出的全局函數(shù),輸出的內(nèi)容會(huì)在最后帶換行。如果你用Xcode,printin將會(huì)輸出內(nèi)容到“console”而板上。(另一種函數(shù)叫print,唯一區(qū)別是在輸出內(nèi)容最后不會(huì)加入換行。)println函數(shù)輸出傳入的String值:printIn(/?Thisisastring)/printsThisisastring像Cocoa里的

47、NSLog函數(shù)一樣,println函數(shù)可以輸出更復(fù)雜的信息。這些信息可以包含當(dāng)前常雖:和變量的值。Swift用字符串插值(stringinterpolation)的方式把常量名或者變量名當(dāng)做占位符加入到長(zhǎng)字符串中,Swift會(huì)用當(dāng)前常量或變雖:的值替換這些占位符。將常量或變量名放入反斜杠符加一對(duì)圓括號(hào)中0:printIn(/?ThecurrentvalueoffriendlyWelcomeis(friendlyWelcome)z,)/printsThecurrentvalueoffriendlyWelcomeisBonjourI;字符串插值所有可用的選項(xiàng)在字符串插值這章中講述。請(qǐng)將你的代碼中的

48、非執(zhí)行文本注釋成提示或者筆記以方便你將來(lái)閱讀。Swift的編譯器將會(huì)在編譯代碼時(shí)自動(dòng)忽略掉注釋部分。Swift中的注釋與C語(yǔ)言的注釋非常相似。單行注釋以雙正斜杠作(/)為起始標(biāo)記:/thisisacomment你也可以進(jìn)行多行注釋,其起始標(biāo)記為單個(gè)正斜杠后跟隨一個(gè)星號(hào)(/*),終止標(biāo)記為一個(gè)星號(hào)后跟隨單個(gè)正斜杠07):/*thisisalsoacommentbutwrittenovermultiplelines*/與c語(yǔ)言多行注釋不同的是,Swift的多行注釋可以嵌套在其它的多行注釋之中。你可以先生成一個(gè)多行注釋塊,然后在這個(gè)注釋塊之中再嵌套成第二個(gè)多行注釋。終止注釋時(shí)先插入第二個(gè)注釋塊的終止

49、標(biāo)記,然后再插入第一個(gè)注釋塊的終止標(biāo)記:/*thisisthestartofthefirstroultilinecomment/*thisisthesecond,nestedmultilineconunent*/thisistheendofthefirstmultilinecomment*/通過(guò)運(yùn)用嵌套多行注釋,你可以快速方便的注釋掉一大段代碼,即使這段代碼之中已經(jīng)含有了多行注釋塊。分號(hào)與其他大部分編程語(yǔ)言不同,Swift并不強(qiáng)制要求你在每條語(yǔ)句的結(jié)尾處使用分號(hào)(;),當(dāng)然,你也可以按照你自己的習(xí)慣添加分號(hào)。有一種情況下必須要用分號(hào),即你打算在同一行內(nèi)寫(xiě)多條獨(dú)立的語(yǔ)句:letcat=;prin

50、tln(cat)/prints整整數(shù)(integer指沒(méi)有小數(shù)部分的整數(shù),如42或-23。整數(shù)既可以是有符號(hào)的(signed,正數(shù)、零、負(fù)數(shù))也可以是無(wú)符號(hào)的(unsigned,正數(shù)或零)。Swift提供&16、32、64位形式的有符號(hào)及無(wú)符號(hào)整數(shù)。這些整數(shù)類型遵循C語(yǔ)言的命名規(guī)約,如8位無(wú)符號(hào)整數(shù)的類型為UInt8,32位有符號(hào)整數(shù)的類型為Int320與Swift中的所有類型一樣,這些整數(shù)類型的名稱以大寫(xiě)字母開(kāi)頭。整數(shù)的邊界各整數(shù)類型允許的最小值及最大值可通過(guò)min及max屬性獲得:letminValue=UInt8.min/minValue等于0,類型為UInt8letmaxValue=U

51、Int8.max/maxValue等于255,類型為UInt8這些屬性的值的類型與對(duì)應(yīng)寬度的數(shù)據(jù)類型一致(如上例為UInt8),因此也可以在表達(dá)式中與同類型的其他數(shù)值一起使用。Int絕大多數(shù)情況下,你并不需要自己決宦代碼中要使用的整數(shù)寬度。Swift還提供了一個(gè)整數(shù)類型Int,其寬度與當(dāng)前平臺(tái)的原生字長(zhǎng)(wordsize)一致:在32位平臺(tái),Int與Int32寬度一致。在64位平臺(tái),Int與Int64寬度一致。除非你需要處理特定寬度的整數(shù),在代碼中應(yīng)該只使用Int表示整數(shù)。這樣可以保證一致性及互運(yùn)算性。即使是在32位平臺(tái),Int也能存儲(chǔ)-2,147,483,648到2,147,483,647的

52、任意數(shù)值,對(duì)于很多整數(shù)區(qū)間需求來(lái)說(shuō).經(jīng)足夠大了。譯注:信蘋(píng)果會(huì)丟飯碗的UIntSwift還提供了無(wú)符號(hào)整數(shù)類型UInt,其寬度與當(dāng)前平臺(tái)的原生字長(zhǎng)一致:在32位平臺(tái),UInt與UInt32寬度一致。在64位平臺(tái),UInt與UInt64寬度一致。:注:只有在特別需要寬度與平臺(tái)原生字長(zhǎng)一致的時(shí)才需要使用無(wú)整數(shù)類型UInt。否則應(yīng)使用Int.即使要存儲(chǔ)的值一:TOC o 1-5 h zIIIIII定非負(fù)。總使用Int表示整數(shù)值有助于保證代碼互運(yùn)算性.避免不同數(shù)據(jù)類型的轉(zhuǎn)換,并且與整數(shù)類型推斷相匹配,II HYPERLINK l bookmark32參見(jiàn)類型安全及類型推斷。i浮點(diǎn)數(shù)浮點(diǎn)數(shù)表示有小數(shù)部分

53、的數(shù)字,例如3.14159、0.1及-273.15。浮點(diǎn)數(shù)類型可以表示的值比整數(shù)類型寬廣得多,也能存儲(chǔ)Int類型能存放的最大及最小值。Swift提供兩種有符號(hào)的浮點(diǎn)數(shù)類型:Double表示一個(gè)64位浮點(diǎn)數(shù)。在浮點(diǎn)數(shù)值非常大或非常梢確時(shí)使用它。Float表示一個(gè)32位浮點(diǎn)數(shù)。在浮點(diǎn)數(shù)值不需要64位精度時(shí)使用它。TOC o 1-5 h zI1II;注意:Double的稱度為15個(gè)I進(jìn)制有效數(shù)字,而Float的梢度只有6位十進(jìn)制有效數(shù)字。應(yīng)根據(jù)代碼所需數(shù)值的:IIII;特點(diǎn)及值域選用合適的浮點(diǎn)數(shù)類型。:II類型安全及類型推斷Swift是一門類型安全的語(yǔ)言。類型安全要求代碼中值的類型非常明確。如果代碼

54、中要求提供String數(shù)據(jù),則不會(huì)錯(cuò)誤地向它傳遞Int數(shù)據(jù)。由于Swift類型安全,它會(huì)在編譯代碼時(shí)執(zhí)行類型檢查,并將任何類型不匹配的地方標(biāo)為錯(cuò)誤。這樣可以在開(kāi)發(fā)過(guò)程中盡可能早地發(fā)現(xiàn)并修復(fù)問(wèn)題。類型檢查有助于在操作不同類型值時(shí)避免錯(cuò)誤。然而,這并不意味著你必須為聲明的每個(gè)常量與變量指定類型。如果你不指定所需值的類型,Swift會(huì)通過(guò)類型推斷(typeinference)求得適當(dāng)?shù)念愋?。類型推斷允許編譯器在編譯代碼時(shí),根據(jù)你提供的值,自動(dòng)推測(cè)出特定表達(dá)式的類型。得益于類型推斷,Swift對(duì)類型聲明的需要比起C或O切ective-C語(yǔ)言而言要少很多。常量與變量仍然有明確的類型,但明確指定類型的工作

55、已經(jīng)由編譯器代你完成。類型推斷在你聲明常量或變量的同時(shí)提供初始值時(shí)尤其有用。通常通過(guò)在聲明時(shí)賦字而值(literalvalue,或稱“字而量”literal)實(shí)現(xiàn)。(字面值指直接出現(xiàn)在源代碼中的值,如下例中的42與3.丄4丄59。)例如,如果將字而值42賦給新的常量,而不明確講它是什么類型,Swift會(huì)推斷出你希望該常量為Int類型,因?yàn)槟愠跏蓟瘯r(shí)提供的數(shù)字像是個(gè)整數(shù)letmeaningOfLife=42/meaningOfLife被推斷屬于Int類型類似地,如果不為浮點(diǎn)數(shù)字而量指定類型,Swift會(huì)推斷出你希望創(chuàng)建一個(gè)Double變量:letpi=3.14159/pi被推斷屬于Double類

56、型Swift在推斷浮點(diǎn)數(shù)類型時(shí)總會(huì)選用Double(而不用Float)。如果在表達(dá)式中同時(shí)使用整數(shù)與浮點(diǎn)數(shù)字面量,將根據(jù)上下文推斷得到Double類型:letanotherPi=3+0.14159/anotherPi也被推斷為Double類型字而值3沒(méi)有明確的類型,自身也不屬于某個(gè)明確的類型,但由于加法中出現(xiàn)了浮點(diǎn)數(shù)字而量,因此推斷出合適的輸出類型為Double.數(shù)字字面量(Literals)整數(shù)字而量可以以下而的形式書(shū)寫(xiě):十進(jìn)制數(shù),無(wú)需前綴二進(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)制表示浮點(diǎn)數(shù)字而值可以為I進(jìn)制(無(wú)需前綴),也可以是I六進(jìn)制(以O(shè)x為前綴)。小數(shù)點(diǎn)兩側(cè)均必須有數(shù)字(或十六進(jìn)制數(shù)字)。還可以有一個(gè)可選的幕次(exponent),對(duì)十進(jìn)制浮點(diǎn)數(shù)為大寫(xiě)或小寫(xiě)的e,對(duì)十六進(jìn)制浮點(diǎn)數(shù)為大寫(xiě)或小寫(xiě)的P。對(duì)幕次為exp的十進(jìn)制數(shù),基數(shù)將乘以lOexp:1.25e2means1.25X102ror125.0.1.25e-2means1.25X10-2ror0.0125.對(duì)幕次為exp的I

58、六進(jìn)制數(shù),基數(shù)將乘以2exp:0 xFp2means15X22zor60.0.0 xFp-2means15X2-2ror3.75.下述所有浮點(diǎn)數(shù)字面量的值均為十進(jìn)制的12.1875:letdecimalDouble=12.1875letexponentDouble=1.21875ellethexadecimalDouble=OxC.BpO數(shù)字字而量可以包含額外的格式以便于閱讀。整數(shù)與浮點(diǎn)數(shù)均可以添加多余的零或下劃線以提高可讀性。兩種格式均不會(huì)影響字而量的實(shí)際值:letpaddedDouble=000123.456letoneMillion=1_000_000letiustOverOneMill

59、ion=1000000.0000001數(shù)字類型轉(zhuǎn)換Int類型應(yīng)作為所有常規(guī)用途的整數(shù)常量及變量的類型,即使它們確實(shí)非負(fù)。通常情況下,使用默認(rèn)的整數(shù)類型意味著這些整型常量與變量均可即時(shí)互相參與運(yùn)算,并可與根據(jù)整數(shù)字而值推斷出的類型相匹配。僅當(dāng)手中的任務(wù)必須使用其他整數(shù)類型時(shí)才用它們,如外部數(shù)據(jù)源提供寬度明確的數(shù)據(jù),或?yàn)榱诵阅堋?nèi)存占用等其他必需優(yōu)化考慮。在這些情況下使用寬度明確的類型有助于發(fā)現(xiàn)偶然的數(shù)值溢出,并還原這些數(shù)據(jù)實(shí)際使用時(shí)的特點(diǎn)。整數(shù)轉(zhuǎn)換不同類型的整數(shù)常量或變量所能存儲(chǔ)的值域不同。Int8常量或變量能存儲(chǔ)-128到127,而UInt8常量或變量能存儲(chǔ)0到255。無(wú)法存放進(jìn)某常量或變量的

60、數(shù)字會(huì)報(bào)編譯時(shí)錯(cuò)誤:letcannotBeNegative:UInt8=-1/UInt8不能存儲(chǔ)負(fù)數(shù),因此會(huì)報(bào)錯(cuò)lettooBig:Int8=Int8.max+1/Int8不能存儲(chǔ)大于其最大值的數(shù)字,/因此這里也會(huì)報(bào)錯(cuò)由于不同數(shù)據(jù)類型能存儲(chǔ)的值域不同,在進(jìn)行數(shù)據(jù)轉(zhuǎn)換時(shí)需要具體問(wèn)題具體對(duì)待。這種實(shí)際選擇的過(guò)程可避免隱式轉(zhuǎn)換的問(wèn)題,并使類型轉(zhuǎn)換的意圖在代碼中明確地展現(xiàn)出來(lái)。要將一種數(shù)據(jù)類型轉(zhuǎn)換為另一種,應(yīng)使用現(xiàn)有值初始化一個(gè)所需類型的新數(shù)。下例中,常量twoThousand的類型為UIntl6,而常量one的類型為UInt8。它們無(wú)法直接相加,因?yàn)轭愋筒煌R虼?,本例將調(diào)用UIntl6(one)新

溫馨提示

  • 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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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)論