天天看點

Swift的重點筆記(基本文法)

  1. Swift和oc的差異:
    • 在 Swift 中沒有了 main.m,@UIApplicationMain 是程式入口
    • 在 Swift 中隻有 .swift 檔案,沒有 .h/.m 檔案的區分
    • 在 Swift 中,一個類就是用一對 {} 括起的,沒有 @implementation 和 @end
    • 每個語句的末尾沒有分号,在其他語言中,分号是用來區分不同語句的
      • 在 Swift 中,一般都是一行一句代碼,是以不用使用分号
    • 與 OC 的文法快速對比
      • 在 OC 中 alloc / init 對應 ()
      • 在 OC 中 alloc / initWithXXX 對應 (XXX: )
      • 在 OC 中的類函數調用,在 Swift 中,直接使用 .
      • 在 Swift 中,絕大多數可以省略 self.,建議一般不寫,可以提高對語境的了解(閉包時會體會到)
      • 在 OC 中的 枚舉類型使用 UIButtonTypeContactAdd,而 Swift 中分開了,操作熱鍵:回車 ->向右 -> .
        • Swift 中,枚舉類型的字首可以省略,如:.ContactAdd,但是:很多時候沒有智能提示
      • 監聽方法,直接使用字元串引起
      • 在 Swift 中使用 print() 替代 OC 中的 NSLog
  1. 常量和變量
    • let 定義常量,一經指派不允許再修改
    • var 定義變量,指派之後仍然可以修改

自動推導:

  • Swift能夠根據右邊的代碼,推導出變量的準确類型
  • 通常在開發時,不需要指定變量的類型
  • 如果要指定變量,可以在變量名後使用:,然後跟上變量的類型
  • Swift 對資料類型要求異常嚴格,任何時候,都不會做隐式轉換
  • 應該盡量先選擇常量,隻有在必須修改時,才需要修改為 var
  1. Optional
    • 定義變量時,如果指定是可選的,表示該變量可以有一個指定類型的值,也可以是 nil
    • 定義變量時,在類型後面添加一個 ?,表示該變量是可選的
    • 變量可選項的預設值是 nil
    • 常量可選項沒有預設值,主要用于在構造函數中給常量設定初始數值

??操作符:

  • ?? 運算符可以用于判斷 變量/常量 的數值是否是 nil,如果是則使用後面的值替代
  • 在使用 Swift 開發時,?? 能夠簡化代碼的編寫
  1. 控制流

if:

  • Swift 中沒有 C 語言中的非零即真概念
  • 在邏輯判斷時必須顯示地指明具體的判斷條件 true / false
  • if 語句條件的 () 可以省略
  • 但是 {} 不能省略

三目運算:

Swift 中的 三目 運算保持了和OC 一緻的風格

可選項判斷

  • 由于可選項的内容可能為 nil,而一旦為 nil 則不允許參與計算
  • 是以在實際開發中,經常需要判斷可選項的内容是否為 nil
  • if let 不能與使用 &&、|| 等條件判斷
  • 如果要增加條件,可以使用 where 子句
  • 注意:where 子句沒有智能提示

iflet n =name, let a = age {

          print(n,a)

       }

Guard:

guard 是與 if let 相反的文法,Swift 2.0推出的

  • 能夠判斷每一個值
  • 在真正的代碼邏輯部分,省略了一層嵌套

 guardlet n = nameelse {

          return

       }

Switch:

  • switch 不再局限于整數
  • switch 可以針對任意資料類型進行判斷
  • 不再需要 break
  • 每一個 case後面必須有可以執行的語句
  • 要保證處理所有可能的情況,不然編譯器直接報錯,不處理的條件可以放在 default 分支中
  • 每一個 case 中定義的變量僅在目前 case 中有效,而 OC 中需要使用 {}
  1. 循環
    1. oc風格:

var sum =0

forvar i =0; i <10; i++ {

    sum += i

}

print(sum)

  1. for-in,0..<10表示從0到9

sum = 0

for iin0..<10 {

    sum += i

}

print(sum)

  1. 範圍 0...10 表示從0到10
  • 省略下标
    • _ 能夠比對任意類型
    • _ 表示忽略對應位置的值

for _ in 0...10 {

    print("hello")

}

  1. 字元串
    1. 在 Swift 中絕大多數的情況下,推薦使用 String 類型
    • String 是一個結構體,性能更高
      • String 目前具有了絕大多數 NSString 的功能
      • String 支援直接周遊
    • NSString 是一個 OC 對象,性能略差
    • Swift 提供了 String 和 NSString 之間的無縫轉換
    1. 周遊字元串中的字元:

for sin str.characters {

    print(s)

}

字元串長度:

let len2 =str.characters.count

// 傳回 utf8編碼長度

let len3 = str.utf8.count

  • 字元串拼接
    • 直接在 "" 中使用 \(變量名) 的方式可以快速拼接字元串
  1. 可選項的拼接
    • 如果變量是可選項,拼接的結果中會有 Optional
    • 為了應對強行解包存在的風險,蘋果提供了 ?? 操作符
    • ?? 操作符用于檢測可選項是否為 nil
      • 如果不是 nil,使用目前值
      • 如果是 nil,使用後面的值替代
  1. Range:
    • 在 Swift 中,String 和 Range連用時,文法結構比較複雜
    • 如果不習慣 Swift 的文法,可以将字元串轉換成 NSString 再處理
  1. 數組
    • 可變&不可變
      • let 定義不可變數組
      • var 定義可變數組

let array = ["zhangsan","lisi"]

  1. 數組的類型:
    • 如果初始化時,所有内容類型一緻,擇數組中儲存的是該類型的内容
    • 如果初始化時,所有内容類型不一緻,擇數組中儲存的是 NSObject
  1. 數組的定義和執行個體化
    • 使用 : 可以隻定義數組的類型
    • 執行個體化之前不允許添加值
    • 使用 [類型]() 可以執行個體化一個空的數組

var array3:[String]

//: 執行個體化之前不允許添加值

//array3.append("laowang")

//: 執行個體化一個空的數組

array3 = [String]()

array3.append("laowang")

  1. 數組的合并:
    • 必須是相同類型的數組才能夠合并
    • 開發中,通常數組中儲存的對象類型都是一樣的!
    • array3 += array1
  2. 記憶體配置設定:

如果向數組中追加元素,超過了容量,會直接在現有容量基礎上 * 2

  1. 字典:
    • 同樣使用 [] 定義字典
    • let 不可變字典
    • var 可變字典
    • [String : NSObject] 是最常用的字典類型

var dict = ["name":"zhangsan","age":18]

  1. 指派:
    • 指派直接使用 dict[key] = value 格式
    • 如果 key 不存在,會設定新值
    • 如果 key 存在,會覆寫現有值
  1. 周遊:
    • k,v 可以随便寫
    • 前面的是 key
    • 後面的是 value
    • for (k, v) in dict {

          print("\(k) ~~~ \(v)")

      }

  1. 函數
    • 函數的定義
      • 格式 func函數名(行參清單) -> 傳回值 {代碼實作}
      • 調用 let result =函數名(值1,參數2:值2...)

funcsum(a: Int, b: Int) ->Int{

    return a + b

}

let result = sum(10, b:20)

  1. 沒有傳回值的函數定義:

funcdemo(str: String) ->Void{

    print(str)

}

funcdemo1(str:String) ->() {

    print(str)

}

funcdemo2(str: String) {

    print(str)

}

  1. 外部參數:
  • 在形參名前再增加一個外部參數名,能夠友善調用人員更好地了解函數的語義
  • 格式:func函數名(外部參數名形式參數名:形式參數類型) ->傳回值類型 { //代碼實作 }
  • Swift 2.0 中,預設第一個參數名省略
    • funcsum1(num1 a: Int, num2 b: Int) ->Int {

          return a + b

      }

  1. 閉包
    1. 與 OC 中的 Block 類似,閉包主要用于異步操作執行完成後的代碼回調,網絡通路結果以參數的形式傳遞給調用方
    2. 定義一個閉包:
      • 閉包 = { (行參) -> 傳回值 in // 代碼實作 }
      • in 用于區分函數定義和代碼實作

let sumFunc = { (num1 x: Int, num2 y: Int) -> Intin

    return x + y

}

sumFunc(num1: 10, num2:20)

  1. 最簡單的閉包:

let demoFunc = {

    print("hello")

}

  1. 循環引用:
    • Swift
      • [weak self]
        • self是可選項,如果self已經被釋放,則為nil
      • [unowned self]
        • self不是可選項,如果self已經被釋放,則出現野指針通路

loadData { [weakself]in

    print("\(self?.view)")

}

loadData { [unownedself]in

    print("\(self.view)")

}

  • Objc
    • __weak typeof(self) weakSelf;
      • 如果self已經被釋放,則為nil
    • __unsafe_unretained typeof(self) weakSelf;
      • 如果self已經被釋放,則出現野指針通路