從零學習Swift 2

2021-07-09 14:13:57 字數 4033 閱讀 3853

定義

let 定義常量,一經賦值不允許再修改

var 定義變數,賦值之後仍然可以修改

//: # 常量

//: 定義常量並且直接設定數值

let x = 20

//: 常量數值一經設定,不能修改,以下**會報錯

// x = 30

//: 使用 `: 型別`,僅僅只定義型別,而沒有設定數值

let x1: int

//: 常量有一次設定數值的機會,以下**沒有問題,因為 x1 還沒有被設定數值

x1 = 30

//: 一旦設定了數值之後,則不能再次修改,以下**會報錯,因為 x1 已經被設定了數值

// x1 = 50

//: # 變數

//: 變數設定數值之後,可以繼續修改數值

var y = 200

y = 300

自動推導

swift能夠根據右邊的**,推導出變數的準確型別

通常在開發時,不需要指定變數的型別

如果要指定變數,可以在變數名後使用:,然後跟上變數的型別

重要技巧:option + click 可以檢視變數的型別

沒有隱式轉換!!!

swift 對資料型別要求異常嚴格

任何時候,都不會做隱式轉換

如果要對不同型別的資料進行計算,必須要顯式的轉換

let x2 = 100

let y2 = 10.5

let num1 = double(x2) + y2

let num2 = x2 + int(y2)

let & var 的選擇

應該盡量先選擇常量,只有在必須修改時,才需要修改為 var

在 xcode 7.0 中,如果沒有修改變數,xcode 會提示修改為 let

optional 是 swift 的一大特色,也是 swift 初學者最容易困惑的問題

定義變數時,如果指定是可選的,表示該變數可以有乙個指定型別的值,也可以是 nil

定義變數時,在型別後面新增乙個 ?,表示該變數是可選的

變數可選項的預設值是 nil

常量可選項沒有預設值,主要用於在建構函式中給常量設定初始數值

//: num 可以是乙個整數,也可以是 nil,注意如果為 nil,不能參與計算

let num: int? = 10

如果 optional 值是 nil,不允許參與計算

只有解包(unwrap)後才能參與計算

在變數後新增乙個 !,可以強行解包

注意:必須要確保解包後的值不是 nil,否則會報錯

//: num 可以是乙個整數,也可以是 nil,注意如果為 nil,不能參與計算

let num: int? = 10

//: 如果 num 為 nil,使用 `!` 強行解包會報錯

let r1 = num! + 100

//: 使用以下判斷,當 num 為 nil 時,if 分支中的**不會執行

iflet n = num

常見錯誤

翻譯在[解包]乙個可選值時發現 nil

?? 運算子

?? 運算子可以用於判斷 變數/常量 的數值是否是 nil,如果是則使用後面的值替代

在使用 swift 開發時,?? 能夠簡化**的編寫

let num: int? = nil

let r1 = (num ?? 0) + 10

print

(r1)

if

swift 中沒有 c 語言中的非零即真概念

在邏輯判斷時必須顯示地指明具體的判斷條件 true / false

if 語句條件的 () 可以省略

但是 {} 不能省略

let num = 200

if num < 10 else

if num > 100 else

三目運算

swift 中的 三目 運算保持了和 oc 一致的風格

var a = 10

var b = 20

let c = a > b ? a : b

print(c)

適當地運用三目,能夠讓**寫得更加簡潔

可選項判斷

由於可選項的內容可能為 nil,而一旦為 nil 則不允許參與計算

因此在實際開發中,經常需要判斷可選項的內容是否為 nil

單個可選項判斷

let url = nsurl(string: "")

//: 方法1: 強行解包 - 缺陷,如果 url 為空,執行時會崩潰

let request = nsurlrequest(url: url!)

//: 方法2: 首先判斷 - **中仍然需要使用 `!` 強行解包

if url != nil

//: 方法3: 使用 `if let`,這種方式,表明一旦進入 if 分支,u 就不在是可選項

iflet u = url where u.host == "www.baidu.com"

可選項條件判斷
//: 1> 初學 swift 一不小心就會讓 if 的巢狀層次很深,讓**變得很醜陋

iflet u = url

}//: 2> 使用 where 關鍵字,

iflet u = url where u.host == "www.baidu.com"

小結

if let 不能與使用 &&、|| 等條件判斷

如果要增加條件,可以使用 where 子句

注意:where 子句沒有智慧型提示

多個可選項判斷

//: 3> 可以使用 `,` 同時判斷多個可選項是否為空

letoname: string? = "張三"

letono: int? = 100

iflet name = oname }if

let name = oname, let

no = ono

判斷之後對變數需要修改

let oname: string? = "張三"

let onum: int? = 18

ifvar name = oname, num = onum

guard
guard 是與 if

let 相反的語法,swift 2.0 推出的

letoname: string? = "張三"

letonum: int? = 18

guard let name = oname else

guard let num = onum else

// **執行至此,name & num 都是有值的

print(name)

print(num)

在程式編寫時,條件檢測之後的**相對是比較複雜的

使用 guard 的好處

能夠判斷每乙個值

在真正的**邏輯部分,省略了一層巢狀

switch

switch 不再侷限於整數

switch 可以針對任意資料型別進行判斷

不再需要 break

每乙個 case後面必須有可以執行的語句

要保證處理所有可能的情況,不然編譯器直接報錯,不處理的條件可以放在 default 分支中

每乙個 case 中定義的變數僅在當前 case 中有效,而 oc 中需要使用 {}

let score = "優"

switch score

switch 中同樣能夠賦值和使用 where 子句

let point = cgpoint(x: 10, y: 10)

switch point

如果只希望進行條件判斷,賦值部分可以省略

switch score

Swift2學習 Swift概覽2 控制流

控制流 使用if和switch構建條件語句,使用for in,for,while和repeat while構建迴圈語句。括號括主條件語句或迴圈變數是可選的。但是擴主主語句是必須的。for score in individualscores else if score 50 else print te...

Swift2學習 Swift概覽6 協議和擴充套件

協議和擴充套件 用protocol宣告乙個協議。protocol exampleprotocol mutating func adjust 類,列舉和結構體都可以接受協議。class class exampleprotocol var a class a.adjust let adescriptio...

Swift2學習 Swift概覽4 物件和類

物件和類 使用class並在其後面跟著類名來建立乙個類。類中常量或者變數已同樣的方法宣告,除非他是類的上下文 類之外 同樣的,方法和類以同樣的方式宣告。class shape 練習 通過let新增乙個常量屬性,並新增另外乙個方法來使用這個引數。通過在類名之後放置一對圓括號來建立乙個類物件。通過小數點...