標籤:des code http com 使用 資料
swift中增加的類型:Tuple(元群組類型),可以讓你建立或者傳遞一組資料,
比如作為函數的返回值時,你可以用一個元組可以返回多個值。
swift中還增加了可選(Optional)類型,用於處理值缺失的情況。
可選表示“那兒有一個值,並且它等於X”或者“那兒沒有值”。
可選有點像在OC中使用nil,但是它可以用在任何類型上,不僅僅是類。
可選類型比OC中的nil指標更加安全也更具表現力。
常量和變數必須在使用前聲明
常量:let maxnum = 10
變數:var currentnum = 50
var x = 0.0, y = 0.0, z = 0.0
類型標註:
var welcomeMessage: String
welcomeMessage = "Hello swift"
注意:一般來說你很少需要寫類型標註。
如果你在聲明常量或者變數的時候賦了一個初始值,
Swift可以推斷出這個常量或者變數的類型,請參考型別安全和類型推斷。
在上面的例子中,沒有給welcomeMessage賦初始值,
所以變數welcomeMessage的類型是通過一個類型標註指定的,
而不是通過初始值推斷的。
常量和變數的命名
你可以用任何字元作為常量和變數名字
let n = 3.14
let 你好 = "你好 swift"
let ???? = "swift good"
注意:常量與變數不能包含數學符號,箭頭,保留的(或者非法的)Unicode碼,
連線與定位字元。也不能以數字開頭,但是可以在常量與變數名的其它地方包含數字
注意:如果你需要使用與Swift保留關鍵字相同的名稱作為常量或者變數名,
你可以使用反引號(`)將關鍵字包圍的方式將其作為名字使用。
無論如何,你應當避免使用關鍵字作為常量或變數名,除非你別無選擇。
可以更改值
var feiendly = "Hello!"
friendly = "swift++!" OK
let lan = "swift+"
lan = "swift++" error編譯器會報錯
輸出常量和變數
printfIn(常量或者變數名) 輸出的內容會在最後換行
print(常量或者變數名) 輸出的內容不會在最後換行
printIn("this is a string!")
預留位置輸出
var name = "Tom"
printIn("the named is \(name)")
注釋:
單行注釋://
多行注釋:/*注釋內容*/
多行注釋中包含多行注釋/* /**/ */
swift每條語句後面可以寫也可以不寫";",但是一種情況必須寫:在同一行內
寫多條獨立的語句。
let cat = "???";printIn(cat)
整數:
範圍:let minValue = Uint8.min Uint8類型最小值0
let maxValue = Uint8.max Uint8類型最大值255
int
一般來說,你不需要指定整數的長度,swift提供了一個特殊的整數類型int,
長度與當前平台的原生字長相同
-在32位平台上,Int和Int32長度相同
-在64位平台上,Int和Int64長度相同
UInt
swift也提供了一個特殊的無符號類型UInt,長度與當前平台的原生字長相同
-在32位平台上,UInt和UInt32長度相同
-在64位平台上,UInt和UInt64長度相同
盡量不用UInt:統一使用Int可以提高代碼的可複用性,
避免不同類型數字之間的轉換,
並且匹配數位類型推測
浮點數
有小數部分的數字,20.36,0.35
double表示64位浮點數
float 表示32位浮點數
注意:Double精確度很高,至少有15位元字,而Float最少只有6位元字。
選擇哪個類型取決於你的代碼需要處理的值的範圍。
類型推測
let meaningOf = 42
meaningOf被推測成int類型
let pi = 3.14159
pi被推測成double類型
當推測浮點數的類型時,Swift 總是會選擇Double而不是Float。
如果運算式中同時出現了整數和浮點數,會被推測為Double類型:
let mun = 3+3.14159
數值類型轉換
let two:UInt16 = 2;
let one:Uint8 = 1;
let onetwo = two+UInt16(one)
整數和浮點數轉換
整數和浮點數的轉換必須顯示指定類型
let three = 3
let point = 0.259
let pi = Double(three)+point
let inter = Int(point)
類型別名:就是給現有類型定義一個名字。(typelias)
typelias audio = UInt16
var maxAmp = audio.min
布爾值
swift有兩個布爾敞亮,true或者false
let one = true;
let two = flase;
if one
{
printIn("this is true!");
}
else
{
printIn("this is false!");
}
let i = 1
if i
{
////程式會報錯
}
let i=1
if i==1
{
////程式不會報錯
}
元組
把多個值組合成一個符合值,元組內的值可以是任意類型,
並不要求是相同類型。
let httpError = (404,"Not Found")
可以描述為一個類型為(int,string)的元組。
你可以將一個元組的內容分解(decompose)成單獨的常量和變數,
然後你就可以正常使用它們了:
let (statusCode,statusMessage) = httpError
printIn("the status code is\(statusCode)")
printIn("the status message is\(statusMessage)")
如果你只需要一部分元組值,
分解的時候可以把要忽略的部分用底線(_)標記:
let (statusCode,_) = httpError
printIn("ths status code is\(statusCode)")
此外,你還可以通過下標來訪問元組中的單個元素,下標從零開始:
printIn("the status code is\(httpError.0)")
printIn("the status Message is\(httpError.1)")
你可以在定義元組的時候給單個元素命名:
let http200 = (statusCode:200,description:"OK")
printIn("the status code is\(http200.statusCode)")
printIn("the description is\(http200.description)")
可選
使用可選來處理值可能缺失的情況。
注意:C 和 Objective-C 中並沒有可選這個概念。
最接近的是 Objective-C 中的一個特性,
一個方法要不返回一個對象要不返回nil,nil表示“缺少一個合法的對象”。
然而,這隻對對象起作用——對於結構體,
基本的 C 類型或者枚舉類型不起作用。
對於這些類型,Objective-C 方法一般會返回一個
特殊值(比如NSNotFound)來暗示值缺失。
這種方法假設方法的調用者知道並記得對特殊值進行判斷。
然而,Swift 的可選可以讓你暗示任意類型的值缺失,並不需要一個特殊值。
下面的例子使用toInt方法來嘗試將一個String轉換成Int
let Number1 = "123"
let converNum = Number.toInt()
因為toInt方法可能會失敗,所以它返回一個可選的(optional)Int,
而不是一個Int。
一個可選的Int被寫作Int?而不是Int。
問號暗示包含的值是可選,也就是說可能包含Int值也可能不包含值。
(不能包含其他任何值比如Bool值或者String值。只能是Int或者什麼都沒有。)
if語句以及強制解析
你可以使用if語句來判斷一個可選是否包含值。
如果可選有值,結果是true,如果沒有值,結果是false。
當你確定可選包確實含值之後,
你可以在可選的名字後面加一個驚嘆號(!)來擷取值。
這個驚歎號表示“我知道這個可選有值,請使用它。
”這被稱為可選值的強制解析(forced unwrapping):
if converNum
{
printIn("\(Numner1) has an value\(converNum!)")
}
else
{
printIn("\(Number1) can not be conver to int")
}
注意:使用!來擷取一個不存在的可選值會導致執行階段錯誤。
使用!來強制解析值之前,一定要確定可選包含一個非nil的值。
可選綁定
使用可選綁定(optional binding)來判斷可選是否包含值,
如果包含就把值賦給一個臨時常量或者變數。
可選綁定可以用在if和while語句中來對可選的值進行判斷並把值賦給一個
常量或者變數。
if let anNum = Number1.toInt()
{
printIn("\(Numner1) has an value\(anNum)")
}
else
{
printIn("\(Number1) can not be conver to int")
}
這段代碼可以被理解為:
“如果Number1.toInt返回的可選Int包含一個值,
建立一個叫做anNum的新常量並將可選包含的值賦給它。”
如果轉換成功,anNum常量可以在if語句的第一個分支中使用。
它已經被可選包含的值初始化過,所以不需要再使用!尾碼來擷取它的值。
在這個例子中,anNumber只被用來輸出轉換結果。
nil
你可以給可選變數賦值為nil來表示它沒有值
var serverRes:Int? = 404
serverRes = nil
注意:nil不能用於非可選的常亮和變數。
如果你的代碼有常亮或者變數需要處理值缺失的情況,請把它們聲明為可選類型。
如果你聲明一個可選常亮或者變數但是沒有複製,它們會自動被設定為nil
var sur:String?
//sur = nil
注意:Swift 的nil和 Objective-C 中的nil並不一樣。
在 Objective-C 中,nil是一個指向不存在對象的指標。
在 Swift 中,nil不是指標——它是一個確定的值,用來表示值缺失。
任何類型的可選都可以被設定為nil,不只是物件類型。
隱式解析可選
這種類型的可選被定義為隱式解析可選(implicitly unwrapped optionals)。
把想要用作可選的類型的後面的問號(String?)改成驚嘆號(String!)
來聲明一個隱式解析可選。
let possA:String? = "this is 強制解析需要!取值"
printIn(possA!)
let possB:String! = "this is 隱式轉換不需要!"
printIn(possB)
你可以把隱式解析可選當做一個可以自動解析的可選。
你要做的只是聲明的時候把驚嘆號放到類型的結尾,
而不是每次取值的可選名字的結尾。
注意:如果你在隱式解析可選沒有值的時候嘗試取值,會觸發執行階段錯誤。
和你在沒有值的普通可選後面加一個驚歎號一樣。
你任然可以把隱式解析可選當做普通可選來判斷它是否包含值
if possB
{
printIn(possB)
}
你也可以在可選綁定中使用隱式解析可選來檢查並解析它的值:
if let defindes = possB
{
printIn(defindes)
}
注意:如果一個變數之後可能變成nil的話請不要使用隱式解析可選。
如果你需要在變數的生命週期中判斷是否是nil的話,請使用普通可選類型。
斷言
可選可以讓你判斷值是否存在,你可以在代碼中優雅地處理值缺失的情況。
然而,在某些情況下,如果值缺失或者值並不滿足特定的條件,
你的代碼可能並不需要繼續執行。
這時,你可以在你的代碼中觸發一個斷言(assertion)來結束代碼運行
並通過調試來找到值缺失的原因。
let age = -3
assert(age >= 0, "A person‘s age cannot be less than zero")
這裡因為age<0,所以斷言會觸發
在這個例子中,只有age >= 0為true的時候代碼運行才會繼續,
也就是說,當age的值非負的時候。
如果age的值是負數,就像代碼中那樣,age >= 0為false,斷言被觸發,
結束應用。
何時使用斷言
當條件可能為假時使用斷言,但是最終一定要保證條件為真,
這樣你的代碼才能繼續運行。
斷言的適用情景:
- 整數的附屬指令碼索引被傳入一個自訂附屬指令碼實現,
但是下標索引值可能太小或者太大。(自己的理解是數組越界)
- 需要給函數傳入一個值,但是非法的值可能導致函數不能正常執行。
- 一個可選值現在是nil,但是後面的代碼運行需要一個非nil值。
注意:
斷言可能導致你的應用終止運行,
所以你應當仔細設計你的代碼來讓非法條件不會出現。
然而,在你的應用發布之前,有時候非法條件可能出現,
這時使用斷言可以快速發現問題。