Swift 3學習筆記第二篇(基礎語法元祖,可選值?和!等)

Deft_MKJing宓珂璟發表於2017-04-17

目錄

1.基礎資料型別

// Swift提供了8,16,32和64有符號和無符號整數,例如16位無符號UInt16,32位有符號Int32

// 整數範圍
// 無符號
let minValue = UInt64.min
let maxValue = UInt64.max
// 有符號
let minValue1 = Int8.min
let maxValue2 = Int8.max

// 我們不需要指定具體位數,在32位機器上,就是Int就是Int32,64位機器上就是Int64,統一使用Int就可


// 浮點型
// 1. Double表示64位浮點數。當你需要儲存很大或者很高精度的浮點數時請使用此型別
// 2. Float表示32位浮點數。精度要求不高的話可以使用此型別
// Double精確度很高,至少有15位數字,而Float最少只有6位數字


// 型別安全和型別推斷
// swift是一個型別安全的語言,編譯器能準確的知道需要處理什麼型別的值,如果你給String傳入一個Int,會馬上報錯
// 型別推斷,當你沒有顯示宣告型別的時候
let numberOfLife = 10 // 編譯器會自動推斷出為Int
let numberOfWork = 10.3 // Double  Swift 總是會選擇Double而不是Float
let numberOfMoview = 3 + 5.6 // Double


2.進位制和型別轉換

// 數值型字面量
/*
 1.十進位制數,沒有字首
 2.二進位制數,0b
 3.八進位制數,0o
 4.十六進位制數,0x
 */
let decimalInt = 35
let binaryInt = 0b100011
let octalInt = 0o43
let hexInt = 0x23

/*
 浮點字面量可以是十進位制,也可以是16進位制,十進位制中指數用e 10的階乘,16進位制中用p  2的階乘

 3.12e2 --- > 312
 3.12e-1 ---> 0.312

 0xCp2 ---- > 48
 0xCp-2 ----> 3
 */

// 示例66.666
let decNum =  15.666
let expDecNum = 1.5666e1
let hexExpNum = 0xf.aa7ef9db22d1p0


// 數值型別轉換  SomeType(ofInitialValue)是呼叫 Swift 構造器並傳入一個初始值的預設方法
let oneone : UInt8 = 10
let twotwo : UInt64 = 2000
let oneAndTwo = UInt64(oneone) + twotwo  // UInt64型別


// 整數和浮點型轉換
let three = 3
let floatNum = 7.998
let result = Double(three) + floatNum // Double

let intResult = Int(floatNum) //浮點會被截斷,只會取整,不會四捨五入,例如9.8-->9,8.1-->8,-2.1-->-2


3.typealias和元祖

// 型別別名 類似於OC的typeOf
typealias mikejing = Int
let testMax = mikejing.max // 9223372036854775807


/*
 把多個值組合成一個複合值。元組內的值可以是任意型別,並不要求是相同型別 --> 元祖 最有用的地方還是作為函式的返回值使用,可以返回多種多樣
 */
let http404Error = (404, "Not Found")
// http404Error 的型別是 (Int, String),值是 (404, "Not Found")
//(404, "Not Found")元組把一個Int值和一個String值組合起來表示 HTTP 狀態碼的兩個部分:一個數字和一個人類可讀的描述。這個元組可以被描述為“一個型別為(Int, String)的元組”

// 訪問方式1
let (statusCode,statusMessage) = http404Error
print("訪問方式1  \(statusMessage)--->\(statusCode)")

// 訪問方式2 如果你只關心一部分
let (statusCode1,_) = http404Error
print("訪問方式2  \(statusCode)")

// 訪問方式3 下標
print("訪問方式3  \(http404Error.0)--->\(http404Error.1)")

// 訪問方式4 指定名稱
let http200Succeed = (code:200,msg:"Succeed")
print("訪問方式4  \(http200Succeed.code)--->\(http200Succeed.msg)")


4.可選型別optionals —> ? 和 !

C 和 Objective-C 中並沒有可選型別這個概念。最接近的是 Objective-C 中的一個特性,一個方法要不返回一個物件要不返回nil,nil表示“缺少一個合法的物件”。然而,這隻對物件起作用——對於結構體,基本的 C 型別或者列舉型別不起作用。對於這些型別,Objective-C 方法一般會返回一個特殊值(比如NSNotFound)來暗示值缺失。這種方法假設方法的呼叫者知道並記得對特殊值進行判斷。然而,Swift 的可選型別可以讓你暗示任意型別的值缺失,並不需要一個特殊值

通俗的概括就是
1.C語言根本沒有可選型別這麼一說
2.OC中的nil是指向不存在物件即空物件的指標,不可以賦值給基本資料型別
3.Swift中nil不是指標,他就是一個明確的值,表示值的缺失,任何型別都可以,不只是物件

// 這裡resultNum被推斷出是Int?可選型別,這裡字串轉換Int可能出現nil的情況 也就是說可能包含Int值也可能不包含值
// 當你確定有值得時候,可以用!來進行強制解析,但是如果是nil,你用!強制解析就會報錯
// fatal error: unexpectedly found nil while unwrapping an Optional value  let originNum = "123e" 解出來就是nil


// Ex 1
let originNum = "123"
let resultNum = Int(originNum)
//print("hehe---\(resultNum)")  hehe---Optional(123)
print("hehe---\(resultNum!)")   // hehe---123


// Ex 2
let originNum1 = "123ddd"
let resutlNum1 = Int(originNum1)
print("\(String(describing: resutlNum1))") // nil 如果直接resultNum1!進行強制解析 ——————> error

// Ex 3
let originNum2 = "123mkj"
let resutlNum2 = Int(originNum2)
if let value = resutlNum2 {
    print("has value ---> \(value)")
}
else{
    print("no value ---> \(String(describing: resutlNum2))")  // no value ---> nil
}


/*
 if 語句以及強制解析
 */

if resutlNum2 != nil {
    print("force par \(resutlNum2!)")
}
else
{
    print("不能強制解析")
}


5.可選繫結Optional Binding

定義:對可選型別的值進行判斷並把值賦給一個常量或者變數

//if let constantName = someOptional {
//    // session
//}

if let constantName = Int(originNum2){
    print("optional bingding has value \(constantName)")
}else{
    print("optional bingding has no value")
}




重寫上面if語句的強制解析
“如果Int(originNum2)返回的可選型別包含一個確切的值,那麼建立一個常量並賦值,如果轉換成功,if分支就可以使用它,由於它已經被可選型別的值初始化了,因此不需要進行強制解析!,可以理解為,給常量能賦值並初始化,這個if判斷必定存在值,而且能成功賦值使用,不然就走下一個分支了,如果你需要使用變數,用var就可以了”


6.隱式解析可選型別

1.可選型別按時常量或者變數可以沒有值,可以用if進行nil判斷,也可以通過可選繫結來解析值
2.如果一個程式中變數或者常量你可以保證肯定有值,每次判斷就沒必要了,就可以被定義為隱式解析型別 宣告 String? –> String!
3.可以理解為自動解析的可選型別,只是在宣告的時候加上!就可以了,不需要每次獲取的時候進行強制解析,直接拿
4.既然可以理解為自動解析的可選型別,那麼如果沒有值,類似於nil的時候進行!強制解析,一樣崩潰


// 隱式解析的對比
let exString : String! = "隱式解析"
print(exString)

let exString1 : String? = "可選型別"
print(exString1!)


7.可選型別的總結


1.當你一個方法的轉換他有可能失敗,因此他有可能不是你想要的值,而是nil,因此例如你要返回的是String,可選型別就是String?,要麼返回string要麼返回nil
2.當你使用的時候,如果你確定可選型別包含值之後,可以使用!來進行強制解析(我確定這個東西有值,給我強制解析使用),這就是可選值型別的強制解析
force unwrapping
3.但是當你用!來解析一個可選型別,如果你確保不了他是否有值,如果是nil,這樣解析的話就會崩潰
4.optional binding可選繫結 對可選型別的值判斷並賦值給一個常量或變數,例如if let constantName = Int(originNum2),可選有值,就能賦值初始化成功,進入分支,否則就跳出
5.nil不可用於常量和變數,如果要使用,必須宣告為可選型別,例如 var varluse : String?沒有顯示賦值,系統給的是nil 注意:
Swift 的nil和 Objective-C 中的nil並不一樣。在 Objective-C 中,nil是一個指向不存在物件(空物件)的指標。在 Swift 中,nil不是指標——它是一個確定的值,用來表示值缺失。任何型別的可選狀態都可以被設定為nil,不只是物件型別。
6.隱式解析 首先保證宣告週期存在必定有值,可以把可選型別?宣告為!,可以理解為自動解析的可選型別,只是宣告的時候統一加!罷了,需要的時候直接取即可


8.斷言:Assert

// 如果是負數,程式碼直接終止,列印log資訊
let testNum = 0
assert(testNum >= 0, "number cannot less than zero")



1.定義:斷言一個條件語句是否為true,如果是,繼續執行,如果false,程式碼停止,你的應用被終止 (列印除錯語句)
2.使用場景:
2.1 整數型別的下標索引被傳入一個自定義下標指令碼實現,但是下標索引值可能太小或者太大。
2.2 需要給函式傳入一個值,但是非法的值可能導致函式不能正常執行。
2.3 一個可選值現在是nil,但是後面的程式碼執行需要一個非nil值。



學習筆記地址


一週學習幾篇Swift基礎,如有不對,歡迎指正
Swift 3學習筆記第二篇(基礎語法元祖,可選值?和!等)Swift 3學習筆記第二篇(基礎語法元祖,可選值?和!等)Swift 3學習筆記第二篇(基礎語法元祖,可選值?和!等)

相關文章