




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
1、1歡迎使用 Swift在本章中您將了解 Swift 的特性和開發(fā)歷史,并對 Swift 有一個初步的了解1.1關于 SwiftSwift 是一種新的編程語言,用于編寫 iOS 和 OS X 應用。Swift 結(jié)合了 C 和 Objective-C 的優(yōu)點并且不受C的兼容性的限制。Swift 使用安全的編程模式并添加了很多新特性,這將使編程更簡單,擴展性更強,也更有趣。除此之外,Swift 還支持人見人愛的 Cocoa 和 Cocoa Touch 框架。擁有了這些特性,Swift將重新定義軟件開發(fā)。Swift 的開發(fā)從很久之前就開始了。為了給 Swift 打好基礎,蘋果公司改進了編譯器,調(diào)試器和
2、框架結(jié)構(gòu)。我們使用自動引用計數(shù)(Automatic Reference Counting, ARC)來簡化內(nèi)存管理。我們在 Foundation 和 Cocoa的基礎上構(gòu)建框架棧并將其標準化。Objective-C 本身支持塊、集合語法和模塊,所以框架可以輕松支持現(xiàn)代編程語言技術(shù)。得益于這些基礎工作,我們現(xiàn)在可以發(fā)布一個新語言,用于未來的蘋果軟件的開發(fā)。Objective-C 開發(fā)者對于 Swift 并不會感到陌生。它采用了 Objective-C 的命名參數(shù)以及動態(tài)對象模型,可以無縫對接到現(xiàn)有的 Cocoa 框架,并且可以兼容 Objective-C 代碼。在此基礎之上,Swift 還有許多
3、新特性并且支持過程式編程和面向?qū)ο缶幊?。Swift 對于初學者來說也很友好。它是第一個既滿足工業(yè)標準又像腳本語言一樣充滿表現(xiàn)力和趣味的編程語言。它支持代碼預覽,這個革命性的特性可以允許程序員在不編譯和運行應用程序的前提下運行 Swift 代碼并實時查看結(jié)果。Swift 將現(xiàn)代編程語言的精華和蘋果工程師文化的智慧結(jié)合了起來。編譯器對性能進行了優(yōu)化,編程語言對開發(fā)進行了優(yōu)化,兩者互不干擾,魚與熊掌兼得。Swift 即可以用于開發(fā)“hello, world”這樣的小程序,也可以用于開發(fā)一個完整的操作系統(tǒng)。所有的這些特性讓 Swift 對于開發(fā)者和蘋果來說都是一項值得的投資。用 Swift 編寫 iO
4、S 和 OS X 應用將是一場美妙的體驗,Swift 之后也會不斷開發(fā)新特性和兼容性。我們對 Swift 充滿信心,你還在等什么!1.2 Swift 初見本頁內(nèi)容包括:簡單值控制流函數(shù)和閉包對象和類枚舉和結(jié)構(gòu)體接口和擴展泛型通常來說,編程語言教程中的第一個程序應該在屏幕上打印“Hello, world”。在 Swift 中,可以用一行代碼實現(xiàn):println(Hello, world)如果你寫過 C 或者 Objective-C 代碼,那你應該很熟悉這種形式在 Swift 中,這行代碼就是一個完整的程序。你不需要為了輸入輸出或者字符串處理導入一個單獨的庫。全局作用域中的代碼會被自動當做程序的入
5、口點,所以你也不需要main函數(shù)。你同樣不需要在每個語句結(jié)尾寫上分號。這個教程會通過一系列編程例子來讓你對 Swift 有初步了解,如果你有什么不理解的地方也不用擔心任何本章介紹的內(nèi)容都會在后面的章節(jié)中詳細講解。注意:為了獲得最好的體驗,在 Xcode 當中使用代碼預覽功能。代碼預覽功能可以讓你編輯代碼并實時看到運行結(jié)果。簡單值使用let來聲明常量,使用var來聲明變量。一個常量的值在編譯時并不需要獲取,但是你只能為它賦值一次。也就是說你可以用常量來表示這樣一個值:你只需要決定一次,但是需要使用很多次。var myVariable = 42myVariable = 50let myConsta
6、nt = 42常量或者變量的類型必須和你賦給它們的值一樣。然而,聲明時類型是可選的,聲明的同時賦值的話,編譯器會自動推斷類型。在上面的例子中,編譯器推斷出myVariable是一個整數(shù)(integer)因為它的初始值是整數(shù)。如果初始值沒有提供足夠的信息(或者沒有初始值),那你需要在變量后面聲明類型,用冒號分割。let implicitInteger = 70let implicitDouble = 70.0let explicitDouble: Double = 70練習:創(chuàng)建一個常量,顯式指定類型為Float并指定初始值為4。值永遠不會被隱式轉(zhuǎn)換為其他類型。如果你需要把一個值轉(zhuǎn)換成其他類型,
7、請顯式轉(zhuǎn)換。let label = The width islet width = 94let widthLabel = label + String(width)練習:刪除最后一行中的String,錯誤提示是什么?有一種更簡單的把值轉(zhuǎn)換成字符串的方法:把值寫到括號中,并且在括號之前寫一個反斜杠。例如:let apples = 3let oranges = 5let appleSummary = I have (apples) apples.let fruitSummary = I have (apples + oranges) pieces of fruit.練習:使用()來把一個浮點計算轉(zhuǎn)
8、換成字符串,并加上某人的名字,和他打個招呼。使用方括號來創(chuàng)建數(shù)組和字典,并使用下標或者鍵(key)來訪問元素。var shoppingList = catfish, water, tulips, blue paintshoppingList1 = bottle of watervar occupations = Malcolm: Captain, Kaylee: Mechanic,occupationsJayne = Public Relations要創(chuàng)建一個空數(shù)組或者字典,使用初始化語法。let emptyArray = String()let emptyDictionary = Dicti
9、onary()如果類型信息可以被推斷出來,你可以用和:來創(chuàng)建空數(shù)組和空字典就像你聲明變量或者給函數(shù)傳參數(shù)的時候一樣。shoppingList = / 去逛街并買點東西控制流使用if和switch來進行條件操作,使用for-in、for、while和do-while來進行循環(huán)。包裹條件和循環(huán)變量括號可以省略,但是語句體的大括號是必須的。let individualScores = 75, 43, 103, 87, 12var teamScore = 0for score in individualScores if score 50 teamScore += 3 else teamScore +
10、= 1 teamScore在if語句中,條件必須是一個布爾表達式這意味著像if score . 這樣的代碼將報錯,而不會隱形地與 0 做對比。你可以一起使用if和let來處理值缺失的情況。有些變量的值是可選的。一個可選的值可能是一個具體的值或者是nil,表示值缺失。在類型后面加一個問號來標記這個變量的值是可選的。var optionalString: String? = HellooptionalString = nilvar optionalName: String? = John Appleseedvar greeting = Hello!if let name = optionalNam
11、e greeting = Hello, (name)練習:把optionalName改成nil,greeting會是什么?添加一個else語句,當optionalName是nil時給greeting賦一個不同的值。如果變量的可選值是nil,條件會判斷為false,大括號中的代碼會被跳過。如果不是nil,會將值賦給let后面的常量,這樣代碼塊中就可以使用這個值了。switch支持任意類型的數(shù)據(jù)以及各種比較操作不僅僅是整數(shù)以及測試相等。let vegetable = red pepperswitch vegetable case celery: let vegetableComment = Add
12、 some raisins and make ants on a log.case cucumber, watercress: let vegetableComment = That would make a good tea sandwich.case let x where x.hasSuffix(pepper): let vegetableComment = Is it a spicy (x)?default: let vegetableComment = Everything tastes good in soup.練習:刪除default語句,看看會有什么錯誤?運行switch中匹配
13、到的子句之后,程序會退出switch語句,并不會繼續(xù)向下運行,所以不需要在每個子句結(jié)尾寫break。你可以使用for-in來遍歷字典,需要兩個變量來表示每個鍵值對。let interestingNumbers = Prime: 2, 3, 5, 7, 11, 13, Fibonacci: 1, 1, 2, 3, 5, 8, Square: 1, 4, 9, 16, 25,var largest = 0for (kind, numbers) in interestingNumbers for number in numbers if number largest largest = number
14、 largest練習:添加另一個變量來記錄哪種類型的數(shù)字是最大的。使用while來重復運行一段代碼直到不滿足條件。循環(huán)條件可以在開頭也可以在結(jié)尾。var n = 2while n 100 n = n * 2nvar m = 2do m = m * 2 while m 100m你可以在循環(huán)中使用.來表示范圍,也可以使用傳統(tǒng)的寫法,兩者是等價的:var firstForLoop = 0for i in 0.3 firstForLoop += ifirstForLoopvar secondForLoop = 0for var i = 0; i 來指定函數(shù)返回值。func greet(name: St
15、ring, day: String) - String return Hello (name), today is (day).greet(Bob, Tuesday)練習:刪除day參數(shù),添加一個參數(shù)來表示今天吃了什么午飯。使用一個元組來返回多個值。func getGasPrices() - (Double, Double, Double) return (3.59, 3.69, 3.79)getGasPrices()函數(shù)的參數(shù)數(shù)量是可變的,用一個數(shù)組來獲取它們:func sumOf(numbers: Int.) - Int var sum = 0 for number in numbers
16、sum += number return sumsumOf()sumOf(42, 597, 12)練習:寫一個計算參數(shù)平均值的函數(shù)。函數(shù)可以嵌套。被嵌套的函數(shù)可以訪問外側(cè)函數(shù)的變量,你可以使用嵌套函數(shù)來重構(gòu)一個太長或者太復雜的函數(shù)。func returnFifteen() - Int var y = 10 func add() y += 5 add() return yreturnFifteen()函數(shù)是一等公民,這意味著函數(shù)可以作為另一個函數(shù)的返回值。func makeIncrementer() - (Int - Int) func addOne(number: Int) - Int ret
17、urn 1 + number return addOnevar increment = makeIncrementer()increment(7)函數(shù)也可以當做參數(shù)傳入另一個函數(shù)。func hasAnyMatches(list: Int, condition: Int - Bool) - Bool for item in list if condition(item) return true return falsefunc lessThanTen(number: Int) - Bool return number Int in let result = 3 * number return r
18、esult )練習:重寫閉包,對所有奇數(shù)返回0.有很多種創(chuàng)建閉包的方法。如果一個閉包的類型已知,比如作為一個回調(diào)函數(shù),你可以忽略參數(shù)的類型和返回值。單個語句閉包會把它語句的值當做結(jié)果返回。你可以通過參數(shù)位置而不是參數(shù)名字來引用參數(shù)這個方法在非常短的閉包中非常有用。當一個閉包作為最后一個參數(shù)傳給一個函數(shù)的時候,它可以直接跟在括號后面。sort(1, 5, 3, 12, 2) $0 $1 對象和類使用class和類名來創(chuàng)建一個類。類中屬性的聲明和常量、變量聲明一樣,唯一的區(qū)別就是它們的上下文是類。同樣,方法和函數(shù)聲明也一樣。class Shape var numberOfSides = 0 fun
19、c simpleDescription() - String return A shape with (numberOfSides) sides. 練習:使用let添加一個常量屬性,再添加一個接收一個參數(shù)的方法。要創(chuàng)建一個類的實例,在類名后面加上括號。使用點語法來訪問實例的屬性和方法。var shape = Shape()shape.numberOfSides = 7var shapeDescription = shape.simpleDescription()這個版本的Shape類缺少了一些重要的東西:一個構(gòu)造函數(shù)來初始化類實例。使用init來創(chuàng)建一個構(gòu)造器。class NamedShape
20、 var numberOfSides: Int = 0 var name: String init(name: String) = name func simpleDescription() - String return A shape with (numberOfSides) sides. 注意self被用來區(qū)別實例變量。當你創(chuàng)建實例的時候,像傳入函數(shù)參數(shù)一樣給類傳入構(gòu)造器的參數(shù)。每個屬性都需要賦值無論是通過聲明(就像numberOfSides)還是通過構(gòu)造器(就像name)。如果你需要在刪除對象之前進行一些清理工作,使用deinit創(chuàng)建一個析構(gòu)函數(shù)。子類的定義方法是在它們的類名后面加上父
21、類的名字,用冒號分割。創(chuàng)建類的時候并不需要一個標準的根類,所以你可以忽略父類。子類如果要重寫父類的方法的話,需要用override標記如果沒有添加override就重寫父類方法的話編譯器會報錯。編譯器同樣會檢測override標記的方法是否確實在父類中。class Square: NamedShape var sideLength: Double init(sideLength: Double, name: String) self.sideLength = sideLength super.init(name: name) numberOfSides = 4 func area() - Do
22、uble return sideLength * sideLength override func simpleDescription() - String return A square with sides of length (sideLength). let test = Square(sideLength: 5.2, name: my test square)test.area()test.simpleDescription()練習:創(chuàng)建NamedShape的另一個子類Circle,構(gòu)造器接收兩個參數(shù),一個是半徑一個是名稱,實現(xiàn)area和describe方法。屬性可以有 getter
23、 和 setter 。class EquilateralTriangle: NamedShape var sideLength: Double = 0.0 init(sideLength: Double, name: String) self.sideLength = sideLength super.init(name: name) numberOfSides = 3 var perimeter: Double get return 3.0 * sideLength set sideLength = newValue / 3.0 override func simpleDescription
24、() - String return An equilateral triagle with sides of length (sideLength). var triangle = EquilateralTriangle(sideLength: 3.1, name: a triangle)triangle.perimetertriangle.perimeter = 9.9triangle.sideLength在perimeter的 setter 中,新值的名字是newValue。你可以在set之后顯式的設置一個名字。注意EquilateralTriangle類的構(gòu)造器執(zhí)行了三步:設置子類聲明
25、的屬性值調(diào)用父類的構(gòu)造器改變父類定義的屬性值。其他的工作比如調(diào)用方法、getters和setters也可以在這個階段完成。如果你不需要計算屬性但是需要在設置一個新值之前運行一些代碼,使用willSet和didSet。比如,下面的類確保三角形的邊長總是和正方形的邊長相同。class TriangleAndSquare var triangle: EquilateralTriangle willSet square.sideLength = newValue.sideLength var square: Square willSet triangle.sideLength = newValue.s
26、ideLength init(size: Double, name: String) square = Square(sideLength: size, name: name) triangle = EquilateralTriangle(sideLength: size, name: name) var triangleAndSquare = TriangleAndSquare(size: 10, name: another test shape)triangleAndSquare.square.sideLengthtriangleAndSquare.triangle.sideLengtht
27、riangleAndSquare.square = Square(sideLength: 50, name: larger square)triangleAndSquare.triangle.sideLength類中的方法和一般的函數(shù)有一個重要的區(qū)別,函數(shù)的參數(shù)名只在函數(shù)內(nèi)部使用,但是方法的參數(shù)名需要在調(diào)用的時候顯式說明(除了第一個參數(shù))。默認情況下,方法的參數(shù)名和它在方法內(nèi)部的名字一樣,不過你也可以定義第二個名字,這個名字被用在方法內(nèi)部。class Counter var count: Int = 0 func incrementBy(amount: Int, numberOfTimes t
28、imes: Int) count += amount * times var counter = Counter()counter.incrementBy(2, numberOfTimes: 7)處理變量的可選值時,你可以在操作(比如方法、屬性和子腳本)之前加?。如果?之前的值是nil,?后面的東西都會被忽略,并且整個表達式返回nil。否則,?之后的東西都會被運行。在這兩種情況下,整個表達式的值也是一個可選值。let optionalSquare: Square? = Square(sideLength: 2.5, name: optional square)let sideLength =
29、optionalSquare?.sideLength枚舉和結(jié)構(gòu)體使用enum來創(chuàng)建一個枚舉。就像類和其他所有命名類型一樣,枚舉可以包含方法。enum Rank: Int case Ace = 1 case Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten case Jack, Queen, King func simpleDescription() - String switch self case .Ace: return ace case .Jack: return jack case .Queen: return queen cas
30、e .King: return king default: return String(self.toRaw() let ace = Rank.Acelet aceRawValue = ace.toRaw()練習:寫一個函數(shù),通過比較它們的原始值來比較兩個Rank值。在上面的例子中,枚舉原始值的類型是Int,所以你只需要設置第一個原始值。剩下的原始值會按照順序賦值。你也可以使用字符串或者浮點數(shù)作為枚舉的原始值。使用toRaw和fromRaw函數(shù)來在原始值和枚舉值之間進行轉(zhuǎn)換。if let convertedRank = Rank.fromRaw(3) let threeDescription
31、= convertedRank.simpleDescription()枚舉的成員值是實際值,并不是原始值的另一種表達方法。實際上,如果原始值沒有意義,你不需要設置。enum Suit case Spades, Hearts, Diamonds, Clubs func simpleDescription() - String switch self case .Spades: return spades case .Hearts: return hearts case .Diamonds: return diamonds case .Clubs: return clubs let hearts
32、= Suit.Heartslet heartsDescription = hearts.simpleDescription()練習:給Suit添加一個color方法,對spades和clubs返回“black”,對hearts和diamonds返回“red”。注意,有兩種方式可以引用Hearts成員:給hearts常量賦值時,枚舉成員Suit.Hearts需要用全名來引用,因為常量沒有顯式指定類型。在switch里,枚舉成員使用縮寫.Hearts來引用,因為self的值已經(jīng)知道是一個suit。已知變量類型的情況下你可以使用縮寫。使用struct來創(chuàng)建一個結(jié)構(gòu)體。結(jié)構(gòu)體和類有很多相同的地方,比如
33、方法和構(gòu)造器。它們之間最大的一個區(qū)別就是 結(jié)構(gòu)體是傳值,類是傳引用。struct Card var rank: Rank var suit: Suit func simpleDescription() - String return The (rank.simpleDescription() of (suit.simpleDescription() let threeOfSpades = Card(rank: .Three, suit: .Spades)let threeOfSpadesDescription = threeOfSpades.simpleDescription()練習:給Car
34、d添加一個方法,創(chuàng)建一副完整的撲克牌并把每張牌的rank和suit對應起來。一個枚舉成員的實例可以有實例值。相同枚舉成員的實例可以有不同的值。創(chuàng)建實例的時候傳入值即可。實例值和原始值是不同的:枚舉成員的原始值對于所有實例都是相同的,而且你是在定義枚舉的時候設置原始值。例如,考慮從服務器獲取日出和日落的時間。服務器會返回正常結(jié)果或者錯誤信息。enum ServerResponse case Result(String, String) case Error(String)let success = ServerResponse.Result(6:00 am, 8:09 pm)let failur
35、e = ServerResponse.Error(Out of cheese.)switch success case let .Result(sunrise, sunset): let serverResponse = Sunrise is at (sunrise) and sunset is at (sunset).case let .Error(error): let serverResponse = Failure. (error)練習:給ServerResponse和switch添加第三種情況。注意如何從ServerResponse中提取日升和日落時間。接口和擴展使用protocol
36、來聲明一個接口。protocol ExampleProtocol var simpleDescription: String get mutating func adjust()類、枚舉和結(jié)構(gòu)體都可以實現(xiàn)接口。class SimpleClass: ExampleProtocol var simpleDescription: String = A very simple class. var anotherProperty: Int = 69105 func adjust() simpleDescription += Now 100% adjusted. var a = SimpleClass(
37、)a.adjust()let aDescription = a.simpleDescriptionstruct SimpleStructure: ExampleProtocol var simpleDescription: String = A simple structure mutating func adjust() simpleDescription += (adjusted) var b = SimpleStructure()b.adjust()let bDescription = b.simpleDescription練習:寫一個實現(xiàn)這個接口的枚舉。注意聲明SimpleStruct
38、ure時候mutating關鍵字用來標記一個會修改結(jié)構(gòu)體的方法。SimpleClass的聲明不需要標記任何方法因為類中的方法經(jīng)常會修改類。使用extension來為現(xiàn)有的類型添加功能,比如添加一個計算屬性的方法。你可以使用擴展來給任意類型添加協(xié)議,甚至是你從外部庫或者框架中導入的類型。extension Int: ExampleProtocol var simpleDescription: String return The number (self) mutating func adjust() self += 42 7.simpleDescription練習:給Double類型寫一個擴展,
39、添加absoluteValue功能。你可以像使用其他命名類型一樣使用接口名例如,創(chuàng)建一個有不同類型但是都實現(xiàn)一個接口的對象集合。當你處理類型是接口的值時,接口外定義的方法不可用。let protocolValue: ExampleProtocol = aprotocolValue.simpleDescription/ protocolValue.anotherProperty / Uncomment to see the error即使protocolValue變量運行時的類型是simpleClass,編譯器會把它的類型當做ExampleProtocol。這表示你不能調(diào)用類在它實現(xiàn)的接口之外實
40、現(xiàn)的方法或者屬性。泛型在尖括號里寫一個名字來創(chuàng)建一個泛型函數(shù)或者類型。func repeat(item: ItemType, times: Int) - ItemType var result = ItemType() for i in 0.times result += item return resultrepeat(knock, 4)你也可以創(chuàng)建泛型類、枚舉和結(jié)構(gòu)體。/ Reimplement the Swift standard librarys optional typeenum OptionalValue case None case Some(T)var possibleInte
41、ger: OptionalValue = .NonepossibleInteger = .Some(100)在類型名后面使用where來指定一個需求列表例如,要限定實現(xiàn)一個協(xié)議的類型,需要限定兩個類型要相同,或者限定一個類必須有一個特定的父類。func anyCommonElements (lhs: T, rhs: U) - Bool for lhsItem in lhs for rhsItem in rhs if lhsItem = rhsItem return true return falseanyCommonElements(1, 2, 3, 3)練習:修改anyCommonEleme
42、nts函數(shù)來創(chuàng)建一個函數(shù),返回一個數(shù)組,內(nèi)容是兩個序列的共有元素。簡單起見,你可以忽略where,只在冒號后面寫接口或者類名。和是等價的。2. Swift 教程本章介紹了 Swift 的各種特性及其使用方法,是全書的核心部分。2.1基礎部分Swift 是 iOS 和 OS X 應用開發(fā)的一門新語言。然而,如果你有 C 或者 Objective-C 開發(fā)經(jīng)驗的話,你會發(fā)現(xiàn) Swift 的很多內(nèi)容都是你熟悉的。Swift 的類型是在 C 和 Objective-C 的基礎上提出的,Int是整型;Double和Float是浮點型;Bool是布爾型;String是字符串。Swift 還有兩個有用的集合
43、類型,Array和Dictionary,詳情參見集合類型(待添加鏈接)。就像 C 語言一樣,Swift 使用變量來進行存儲并通過變量名來關聯(lián)值。在 Swift 中,值不可變的變量有著廣泛的應用,它們就是常量,而且比 C 語言的常量更強大。在 Swift 中,如果你要處理的值不需要改變,那使用常量可以讓你的代碼更加安全并且更好地表達你的意圖。除了我們熟悉的類型,Swift 還增加了 Objective-C 中沒有的類型比如元組(Tuple)。元組可以讓你創(chuàng)建或者傳遞一組數(shù)據(jù),比如作為函數(shù)的返回值時,你可以用一個元組可以返回多個值。Swift 還增加了可選(Optional)類型,用于處理值缺失的
44、情況。可選表示“那兒有一個值,并且它等于 x ”或者“那兒沒有值”??蛇x有點像在 Objective-C 中使用nil,但是它可以用在任何類型上,不僅僅是類??蛇x類型比 Objective-C 中的nil指針更加安全也更具表現(xiàn)力,它是 Swift 許多強大特性的重要組成部分。Swift 是一個類型安全的語言,可選就是一個很好的例子。Swift 可以讓你清楚地知道值的類型。如果你的代碼期望得到一個String,類型安全會阻止你不小心傳入一個Int。你可以在開發(fā)階段盡早發(fā)現(xiàn)并修正錯誤。常量和變量常量和變量把一個名字(比如maximumNumberOfLoginAttempts或者welcomeMe
45、ssage)和一個指定類型的值(比如數(shù)字10或者字符串Hello)關聯(lián)起來。常量的值一旦設定就不能改變,而變量的值可以隨意更改。聲明常量和變量常量和變量必須在使用前聲明,用let來聲明常量,用var來聲明變量。下面的例子展示了如何用常量和變量來記錄用戶嘗試登錄的次數(shù):let maximumNumberOfLoginAttempts = 10var currentLoginAttempt = 0這兩行代碼可以被理解為 : “聲明一個名字是maximumNumberOfLoginAttempts的新常量,并給它一個值10。然后,聲明一個名字是currentLoginAttempt的變量并將它的值初
46、始化為0.”在這個例子中,允許的最大嘗試登錄次數(shù)被聲明為一個常量,因為這個值不會改變。當前嘗試登錄次數(shù)被聲明為一個變量,因為每次嘗試登錄失敗的時候都需要增加這個值。你可以在一行中聲明多個常量或者多個變量,用逗號隔開:var x = 0.0, y = 0.0, z = 0.0注意:如果你的代碼中有不需要改變的值,請將它聲明為常量。只將需要改變的值聲明為變量。類型標注當你聲明常量或者變量的時候可以加上類型標注,說明常量或者變量中要存儲的值的類型。如果要添加類型標注,在常量或者變量名后面加上一個冒號和空格,然后加上類型名稱。這個例子給welcomeMessage變量添加了類型標注,表示這個變量可以存
47、儲String類型的值:var welcomeMessage: String聲明中的冒號代表著“是.類型”,所以這行代碼可以被理解為:“聲明一個類型為String,名字為welcomeMessage的變量?!薄邦愋蜑镾tring”的意思是“可以存儲任意String類型的值?!眞elcomeMessage變量現(xiàn)在可以被設置成任意字符串:welcomeMessage = Hello注意:一般來說你很少需要寫類型標注。如果你在聲明常量或者變量的時候賦了一個初始值,Swift可以推斷出這個常量或者變量的類型,詳情參見類型安全和類型推斷(待添加鏈接)。在上面的例子中,沒有給welcomeMessage賦
48、初始值,所以添加了一個類型標注。常量和變量的命名你可以用任何你喜歡的字符作為常量和變量名,包括Unicode字符: let = 3.14159 let 你好 = 你好世界 let = dogcow常量與變量名不能包含數(shù)學符號,箭頭,保留的(或者非法的)Unicode碼位,連線與制表符。盡管常量與變量名中可以包含數(shù)字,但是它們不能以數(shù)字打頭。一旦你將常量或者變量聲明為確定的類型,你就不能使用相同的名字再次進行聲明,或者以改變其存儲的值為其他類型。同時,你也不能將常量與變量進行互轉(zhuǎn)。注意:如果你需要使用與Swift保留關鍵字相同的名稱作為常量或者變量名,你可以使用反引號()將關鍵字圍住的方式將其作
49、為名字使用。無論如何,你應當避免使用關鍵字作為常量或變量名,除非你別無選擇。你可以更改現(xiàn)有的變量值為其他同類型的值,在下面的例子中,friendlyWelcome的值從Hello!改為了Bonjour!: var friendlyWelcome = Hello! friendlyWelcome = Bonjour! / friendlyWelcome is now Bonjour!和變量不一樣,常量的值一旦被確定以后就不能更改了。嘗試這樣做會在編譯時報錯: let languageName = Swift languageName = Swift+ / this is a compile-ti
50、me error - languageName cannot be changed輸出常量和變量你可以用println函數(shù)來輸出當前常量或變量的值: println(friendlyWelcome) / prints Bonjour!println是一個用來輸出的全局函數(shù),輸出的內(nèi)容會在最后帶換行。如果你用Xcode,println將會輸出內(nèi)容到“console”面板上。(另一種函數(shù)叫print,唯一區(qū)別是在輸出內(nèi)容最后不會加入換行。)println函數(shù)輸出傳入的String值: println(This is a string) / prints This is a string像Cocoa
51、里的NSLog函數(shù)一樣,println函數(shù)可以輸出更復雜的信息。這些信息可以包含當前常量和變量的值。Swift用字符串插值(string interpolation)的方式把常量名或者變量名當做占位符加入到長字符串中,Swift會用當前常量或變量的值替換這些占位符。將常量或變量名放入反斜杠符加一對圓括號中(): println(The current value of friendlyWelcome is (friendlyWelcome) / prints The current value of friendlyWelcome is Bonjour!注意:字符串插值所有可用的選項在 字符串
52、插值 這章中講述。注釋請將你的代碼中的非執(zhí)行文本注釋成提示或者筆記以方便你將來閱讀。Swift 的編譯器將會在編譯代碼時自動忽略掉注釋部分。Swift 中的注釋與C 語言的注釋非常相似。單行注釋以雙正斜杠作(/)為起始標記:/ this is a comment你也可以進行多行注釋,其起始標記為單個正斜杠后跟隨一個星號(/*),終止標記為一個星號后跟隨單個正斜杠(*/):/* this is also a comment,but written over multiple lines */與C 語言多行注釋不同的是,Swift 的多行注釋可以嵌套在其它的多行注釋之中。你可以先生成一個多行注釋塊
53、,然后在這個注釋塊之中再嵌套成第二個多行注釋。終止注釋時先插入第二個注釋塊的終止標記,然后再插入第一個注釋塊的終止標記:/* this is the start of the first multiline comment/* this is the second, nested multiline comment */this is the end of the first multiline comment */通過運用嵌套多行注釋,你可以快速方便的注釋掉一大段代碼,即使這段代碼之中已經(jīng)含有了多行注釋塊。分號與其他大部分編程語言不同,Swift 并不強制要求你在每條語句的結(jié)尾處使用分號(;
54、),當然,你也可以按照你自己的習慣添加分號。有一種情況下必須要用分號,即你打算在同一行內(nèi)寫多條獨立的語句:let cat = ; println(cat)/ prints 整數(shù)整數(shù)就是沒有小數(shù)部分的數(shù)字,比如42和-23。整數(shù)可以是有符號(正、負、零)或者無符號(正、零)。Swift 提供了8、16、32和64位的有符號和無符號整數(shù)類型。這些整數(shù)類型和 C 語言的命名方式很像,比如8位無符號整數(shù)類型是UInt8,32位有符號整數(shù)類型是Int32。就像 Swift 的其他類型一樣,整數(shù)類型采用大寫命名法。整數(shù)范圍你可以訪問不同整數(shù)類型的min和max屬性來獲取對應類型的最大值和最小值:let m
55、inValue = UInt8.min / minValue 為 0,是 UInt8 類型的最小值let maxValue = UInt8.max / maxValue 為 255,是 UInt8 類型的最大值Int一般來說,你不需要專門指定整數(shù)的長度。Swift 提供了一個特殊的整數(shù)類型Int,長度與當前平臺的原生字長相同:在32位平臺上,Int和Int32長度相同。在64位平臺上,Int和Int64長度相同。除非你需要特定長度的整數(shù),一般來說使用Int就夠了。這可以提高代碼一致性和可復用性。即使是在32位平臺上,Int可以存儲的整數(shù)范圍也可以達到-21474836482147483647,
56、大多數(shù)時候這已經(jīng)足夠大了。UIntSwift 也提供了一個特殊的無符號類型UInt,長度與當前平臺的原生字長相同:在32位平臺上,UInt和UInt32長度相同。在64位平臺上,UInt和UInt64長度相同。注意:盡量不要使用UInt,除非你真的需要存儲一個和當前平臺原生字長相同的無符號整數(shù)。除了這種情況,最好使用Int,即使你要存儲的值已知是非負的。統(tǒng)一使用Int可以提高代碼的可復用性,避免不同類型數(shù)字之間的轉(zhuǎn)換,并且匹配數(shù)字的類型推測,詳情參見 HYPERLINK http:/numbbbbb.github.io/the-swift-programming-language-in-chi
57、nese/chapter2/01_The_Basics.html l # 類型安全和類型推測 類型安全和類型推測。浮點數(shù)浮點數(shù)是有小數(shù)部分的數(shù)字,比如3.14159,0.1和-273.15。浮點類型比整數(shù)類型表示的范圍更大,可以存儲比Int類型更大或者更小的數(shù)字。Swift 提供了兩種有符號浮點數(shù)類型:Double表示64位浮點數(shù)。當你需要存儲很大或者很高精度的浮點數(shù)時請使用此類型。Float表示32位浮點數(shù)。精度要求不高的話可以使用此類型。注意:Double精確度很高,至少有15位數(shù)字,而Float最少只有6位數(shù)字。選擇哪個類型取決于你的代碼需要處理的數(shù)字大小。類型安全和類型推測Swift
58、是一個類型安全的語言。類型安全的語言可以讓你清楚地知道代碼要處理的值的類型。如果你的代碼需要一個String,你絕對不可能不小心傳進去一個Int。Swift 是類型安全的,會在編譯你的代碼時進行類型檢查,如果遇到不匹配的類型會報錯。這可以讓你在開發(fā)的時候盡早發(fā)現(xiàn)并修復錯誤。當你要處理不同類型的值時,類型檢查可以幫你避免錯誤。然而,這并不是說你每次聲明常量和變量的時候都需要顯式指定類型。如果你沒有顯式指定類型,Swift 會使用類型推測來選擇合適的類型。有了類型推測,編譯器可以在編譯代碼的時候自動推測出表達式的類型。原理很簡單,判斷你賦的值即可。因為有類型推測,和 C 或者 Objc 比起來 S
59、wift 很少需要聲明類型。常量和變量雖然需要明確類型,但是大部分工作并不需要你自己來完成。當你聲明常量或者變量并賦初值的時候類型推測非常有用。當你在聲明常量或者變量的時候賦給它們一個原始值即可觸發(fā)類型推測。(原始值就是會直接出現(xiàn)在你代碼中的值,比如42和3.14159。)舉個例子,如果你給一個新常量賦值42并且沒有標明類型,Swift 可以推測出常量類型是Int,因為你給它賦的初值看起來很像一個整數(shù):let meaningOfLife = 42/ meaningOfLife 會被推測為 Int 類型同理,如果你沒有給浮點原始值標明類型,Swift 會推測你想要的是Double:let pi
60、= 3.14159/ pi 會被推測為 Double 類型當推測浮點數(shù)的類型時,Swift 總是會選擇Double而不是Float。如果表達式中同時出現(xiàn)了整數(shù)和浮點數(shù),會被推測為Double類型:let anotherPi = 3 + 0.14159/ anotherPi 會被推測為 Double 類型原始值3沒有顯式聲明類型,而表達式中出現(xiàn)了一個浮點原始值,所以表達式會被推測為Double類型。數(shù)值類原始值整數(shù)原始值可以被寫作:一個十進制數(shù),沒有前綴一個二進制數(shù),前綴是0b一個八進制數(shù),前綴是0o一個十六進制數(shù),前綴是0 x下面的所有整數(shù)原始值的十進制值都是17:let decimalInt
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 溝渠隧道開挖施工方案
- 砂巖沉積盆地施工方案
- 混凝土擋土壩施工方案
- 墻體管道美化施工方案
- 水泥穩(wěn)定土施工方案
- 二零二五年度保密技術(shù)合作保密費及保密期限協(xié)議
- 二零二五年度養(yǎng)老服務業(yè)勞動合同違約賠償及服務質(zhì)量標準合同
- 2025年度購房合同簽訂及后續(xù)房產(chǎn)增值服務協(xié)議
- 2025年法拍房屋拍賣議價及成交保障合同
- 二零二五年度大型光伏發(fā)電站項目設備安裝合同
- GB/T 30797-2014食品用洗滌劑試驗方法總砷的測定
- GB/T 20057-2012滾動軸承圓柱滾子軸承平擋圈和套圈無擋邊端倒角尺寸
- GB/T 19808-2005塑料管材和管件公稱外徑大于或等于90mm的聚乙烯電熔組件的拉伸剝離試驗
- GB/T 10051.1-2010起重吊鉤第1部分:力學性能、起重量、應力及材料
- 2022年人民交通出版社股份有限公司招聘筆試試題及答案解析
- 班組建設工作體系課件
- 第章交通調(diào)查與數(shù)據(jù)分析課件
- 2022年江西制造職業(yè)技術(shù)學院單招語文試題及答案解析
- 穆斯林太巴熱咳慶念詞文
- 軟硬結(jié)合板的設計制作與品質(zhì)要求課件
- 中醫(yī)院情志養(yǎng)生共64張課件
評論
0/150
提交評論