標籤:des http 使用 os strong 資料
swift 類型
變數聲明
用let來聲明常量,用var來聲明變數
可以在一行中聲明多個常量或者多個變數,用逗號隔開
var x = 0.0, y = 0.0, z = 0.0
型別安全
Swift 是一個型別安全(type safe)的語言。型別安全的語言可以讓你清楚地知道代碼要處理的值的類型。
一個變數是什麼類型,通過兩種方式來表達:
-
類型標註
-
類型標註表示這個變數可以儲存某種類型的值,聲明中的冒號代表著“是...類型”:
var welcomeMessage: String
-
類型推斷
-
如果你沒有顯式指定類型,Swift 會使用類型推斷(type inference)來選擇合適的類型。有了類型推斷,編譯器可以在編譯代碼的時候自動推斷出運算式的類型。原理很簡單,只要檢查你賦的值即可。
注意:當推斷浮點數的類型時,Swift 總是會選擇Double而不是Float。一般來說你很少需要寫類型標註。如果你在聲明常量或者變數的時候賦了一個初始值,Swift可以推斷出這個常量或者變數的類型
變數命名
- 當你將常量或者變數聲明為確定的類型,你就不能使用相同的名字再次進行聲明,或者改變其儲存的值的類型
- 如果你需要使用與Swift保留關鍵字相同的名稱作為常量或者變數名,你可以使用反引號(`)將關鍵字包圍的方式將其作為名字使用。
- 常量的值一旦被確定就不能更改了。嘗試這樣做會導致編譯時間報錯
列印變數和常量
println是一個用來輸出的全域函數,輸出的內容會在最後換行。
xcode的playground使用println,點擊工具條的show the Assistant editor.即能顯示輸出
var str = "Hello, playground" println(str)
類型轉換
SomeType(ofInitialValue)是調用 Swift 構造器並傳入一個初始值的預設方法。
注意,你並不能傳入任意類型的值,只能傳入SomeType內部有對應構造器的值。
不過你可以擴充現有的類型來讓它可以接收其他類型的值(包括自訂類型)
不同整數類型的變數和常量可以儲存不同範圍的數字,如果數字超出了常量或者變數可儲存的範圍,編譯的時候會報錯:
let cannotBeNegative: UInt8 = -1// UInt8 類型不能儲存負數,所以會報錯let tooBig: Int8 = Int8.max + 1// Int8 類型不能儲存超過最大值的數,所以會報錯let twoThousand: UInt16 = 2_000let one: UInt8 = 1//在語言內部,UInt16有一個構造器,可以接受一個UInt8類型的值,所以這個構造器可以用現有的UInt8來建立一個新的UInt16let twoThousandAndOne = twoThousand + UInt16(one)
類型別名
類型別名(type aliases)就是給現有類型定義另一個名字。你可以使用typealias關鍵字來定義類型別名。
typealias AudioSample = UInt16 var maxAmplitudeFound = AudioSample.min// maxAmplitudeFound 現在是 0
斷言
可以使用斷言來保證在運行其他代碼之前,某些重要的條件已經被滿足。
如果條件判斷為true,代碼運行會繼續進行;如果條件判斷為false,代碼運行停止,你的應用被終止。
let age = -3assert(age >= 0, "A person‘s age cannot be less than zero")// 因為 age < 0,所以斷言會觸發,代碼運行停止,應用被終止
可以做調試使用
整型 Int
Swift 提供了8,16,32和64位的有符號和不帶正負號的整數類型。
Swift 提供了一個特殊的整數類型Int,長度與當前平台的原生字長相同:
- 在32位平台上,Int和Int32長度相同。
- 在64位平台上,Int和Int64長度相同。
Swift 也提供了一個特殊的無符號類型UInt,長度與當前平台的原生字長相同:
- 在32位平台上,UInt和UInt32長度相同。
- 在64位平台上,UInt和UInt64長度相同。
盡量不要使用UInt,除非你真的需要儲存一個和當前平台原生字長相同的不帶正負號的整數。
除了這種情況,最好使用Int,即使你要儲存的值已知是非負的。
統一使用Int可以提高代碼的可複用性,避免不同類型數字之間的轉換,並且匹配數位類型推斷
浮點型 Double和Float
- Double表示64位浮點數。當你需要儲存很大或者很高精度的浮點數時請使用此類型。
- Float表示32位浮點數。精度要求不高的話可以使用此類型。
布爾型 Bool
Swift 有兩個布爾常量,true和false:
let orangesAreOrange = truelet turnipsAreDelicious = false
字元竄 String 和 Character(字元)
Swift 的String類型表示特定序列的Character(字元)類型值的集合,不能用下標取
for character in "Dog!??" { println(character)}let yenSign: Character = "¥"
字元竄串連通過+號將兩個字元竄相連
var emptyString = "" // Null 字元串字面量var anotherEmptyString = String() // 初始化 String 執行個體emptyString == anotherEmptyString //trueif emptyString.isEmpty { println("什麼都沒有")}let string1 = "hello"let string2 = " there"let character1: Character = "!"let character2: Character = "?"let stringPlusCharacter = string1 + character1 // 等於 "hello!"let stringPlusString = string1 + string2 // 等於 "hello there"let characterPlusString = character1 + string1 // 等於 "!hello"let characterPlusCharacter = character1 + character2 // 等於 "!?"
字元竄插值
字串插值是一種構建新字串的方式,可以在其中包含常量、變數、字面量和運算式。
let multiplier = 3let message = "\(multiplier) 乘以 2.5 是 \(Double(multiplier) * 2.5)"
插值字串中寫在括弧中的運算式不能包含非轉義雙引號 (") 和反斜線 (\),並且不能包含斷行符號或分行符號。 插值可以省去額外的加號進行運算式的串連
數組 Array
數組按順序儲存相同類型的資料
聲明數組
var shoppingList: String[] = ["Eggs", "Milk"] var shoppingList = ["Eggs", "Milk"] var someInts = Int[]() var threeDoubles = Double[](count: 3, repeatedValue:0.0)// [0.0, 0.0, 0.0] var anotherThreeDoubles = Array(count: 3, repeatedValue: 2.5)//類型推斷[2.5, 2.5, 2.5]
添加資料,修改資料,讀取資料,刪除資料,
//添加資料 shoppingList.append("Flour") shoppingList += "Baking Powder" shoppingList += ["Chocolate Spread", "Cheese", "Butter"] shoppingList.insert("Maple Syrup", atIndex: 0) //修改資料 shoppingList[0] = "aaa" shoppingList[4...6] = ["Bananas", "Apples"]//區間操作符,不能越界想數組尾部添加資料 //讀取資料 var firstItem = shoppingList[0] for item in shoppingList { println(item) } //全域enumerate函數來進行數組遍曆。enumerate返回一個由每一個資料項目索引值和資料值組成的元組 for (index, value) in enumerate(shoppingList) { println("Item \(index + 1): \(value)") } //刪除資料 shoppingList.removeAtIndex(0) let apples = shoppingList.removeLast() someInts = [] //重設未空數組
字典 Dictionary
無序儲存相同類型資料值但是需要由專屬的標識符引用和定址(就是索引值對)
聲明字典
var airports: Dictionary<String, String> = ["TYO": "Tokyo", "DUB": "Dublin"] var airports = ["TYO": "Tokyo", "DUB": "Dublin"] var namesOfIntegers = Dictionary<Int, String>()ßß
讀取字典和修改字典資料,刪除字典資料(使用nil)
airports.updateValue("Dublin Internation", forKey: "DUB")airports["APL"] = "Apple Internation"airports["APL"] = nil // APL現在被移除了airports.removeValueForKey("DUB")namesOfIntegers = [:]//重設為空白字典
字典遍曆,Swift 的字典類型是無序集合類型。其中字典鍵,值,索引值對在遍曆的時候會重新排列,而且其中順序是不固定的。
//注意這裡沒有使用enumeratefor (airportCode, airportName) in airports { println("\(airportCode): \(airportName)")}for airportCode in airports.keys { println("Airport code: \(airportCode)")}for airportName in airports.values { println("Airport name: \(airportName)")}//使用字典建立數組let airportCodes = Array(airports.keys)let airportNames = Array(airports.values)
數組和字典的不可變性
- 當為變數的時候,字典和數組想怎麼玩都可以怎麼玩
- 當數組為常量時,不能試著改變任何不可變數組的大小,但是我們可以重新設定相對現存索引所對應的值
- 當字典為常量時,意味著我們不能替換其中任何現有鍵所對應的值。不可變字典的內容在被首次設定之後不能更改。
元組 Tuple
元組取下標使用.操作符..數組和字典取下標使用[];
聲明元組
var http404Error = (404, "Not Found") //預設下標0,1 var http200Status = (statusCode: 200, description: "OK")//預設下標依然存在
訪問元組
println(http404Error.0); println(http200Status.0); println(http200Status.statusCode);
分解元組,如果你只需要一部分元組值,分解的時候可以把要忽略的部分用底線(_)標記
let (statusCode, statusMessage) = http404Error let (justTheStatusCode, _) = http404Error
元組很像php中的數組.但是swift是型別安全的.所以如果初始化下標和值後,然後再次賦不同的下標或者不同類型的值,則會報錯.
http200Status = ("ddd","dddd"); //錯誤
元組在臨時組織值的時候很有用,但是並不適合建立複雜的資料結構。如果你的資料結構並不是臨時使用,請使用類或者結構體而不是元組。
可選類型 Optional
要麼為nil,要麼有值等於x.
- nil不能用於非可選的常量和變數。如果你的代碼中有常量或者變數需要處理值缺失的情況,請把它們聲明成對應的可選類型。
- nil可以用來給字典移除一個索引值對
聲明可選類型
var optional:Int? //值為nil let possibleNumber = "123" let convertedNumber = possibleNumber.toInt() // convertedNumber 被推測為類型 "Int?", 或者類型 "optional Int"
可選類型的變數不能直接使用,需要先判斷其確實有值,然後使用!解析,注意!號是放在變數名後面,放在前面是代表操作符 否的意思
由於使用!來擷取一個不存在的可選值會導致執行階段錯誤。使用!來強制解析值之前,一定要確定可選包含一個非nil的值。所以最好使用if進行判斷
if convertedNumber { println("\(possibleNumber) has an integer value of \(convertedNumber!)")} else { println("\(possibleNumber) could not be converted to an integer")}
可選綁定語句,可以省略解析!.可選綁定可以用在if和while語句中來對可選類型的值進行判斷並把值賦給一個常量或者變數。
if let actualNumber = possibleNumber.toInt() { // println("\(possibleNumber) has an integer value of \(actualNumber)")} else { println("\(possibleNumber) could not be converted to an integer")}
隱式解析可選類型
隱式解析可選類型是一個可以自動解析的可選類型。你要做的只是聲明的時候把驚嘆號放到類型的結尾,而不是每次取值的可選名字的結尾。
let possibleString: String? = "An optional string." println(possibleString!) // 需要驚歎號來擷取值 let assumedString: String! = "An implicitly unwrapped optional string." println(assumedString) // 不需要驚嘆號 // 輸出 "An implicitly unwrapped optional string."
除了不用使用!強制解析外,其他的和可選類型一樣. 同樣如果你在隱式解析可選類型沒有值的時候嘗試取值,會觸發執行階段錯誤。和你在沒有值的普通可選類型後面加一個驚歎號一樣。
if assumedString { println(assumedString) } // 輸出 "An implicitly unwrapped optional string." if let definiteString = assumedString { println(definiteString) }// 輸出 "An implicitly unwrapped optional string."