Swift 3學習筆記第二篇(基礎語法元祖,可選值?和!等)
目錄
- 1.基礎資料型別整型和浮點型
- 2.進位制和型別轉換
- 3.元祖
- 4.可選型別optionals –>?和!
- 5.可選繫結Optional Binding
- 6.隱式解析可選型別 –> 宣告的時候帶上!
- 7.可選型別個人理解的概括
- 8.斷言:Assert
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學習筆記《2》-swift語法Swift筆記
- Python 3 學習筆記之——基礎語法Python筆記
- Hive學習筆記:基礎語法Hive筆記
- Scala學習筆記(2)-基礎語法筆記
- Kotlin學習筆記-基礎語法Kotlin筆記
- Go學習筆記 - Go 基礎語法(1)Go筆記
- Go 學習筆記 - Go 基礎語法(2)Go筆記
- Erlang學習筆記(三)Erlang基礎語法筆記
- Swift 3學習筆記第一篇(語法概覽)Swift筆記
- go 學習記錄--基礎語法Go
- swift學習筆記《3》-技巧Swift筆記
- Go 基礎語言學習筆記Go筆記
- swift語言新特性:可選值Swift
- 菜鳥學習筆記:Java基礎篇1(基礎語法、物件導向)筆記Java物件
- Java基礎 語法筆記Java筆記
- Java基礎語法筆記Java筆記
- Swift:基礎語法(一)Swift
- Swift基礎語法[ 1 ]Swift
- swift 基礎筆記Swift筆記
- 1天學會swift2 0語法 (1) 常量 可選值 判斷Swift
- c語言程式基礎學習筆記C語言筆記
- Erlang學習筆記(二)Erlang基礎語法之If、Case的使用筆記
- 《從零開始學Swift》學習筆記(Day 27)——可選型別Swift筆記型別
- Markdown 基礎語法的學習和使用
- 學習Rust 基礎語法Rust
- markdown學習(基礎語法)
- 基礎排序(冒泡、選擇、插入)學習筆記排序筆記
- 真香,理解記憶法學習Python基礎語法Python
- swift的基礎語法(二)Swift
- swift的基礎語法(一)Swift
- ABAP學習筆記-基礎語法-05-字串的處理(02)筆記字串
- R語言學習筆記:基礎知識R語言筆記
- python菜鳥教程學習3:基礎語法Python
- Latex排版學習筆記(3)——latex基礎教程筆記
- C++基礎知識學習筆記(3)C++筆記
- swift語法-讀書筆記Swift筆記
- Blazor和Vue對比學習(基礎1.2):模板語法和Razor語法BlazorVue
- Swift學習筆記(三十二)——可變引數Swift筆記