Swift

1.Swift項目與OC項目的區別程序員

 - Swift的類文件是以 .swift 結尾swift

 - main.m 不見了,程序入口以 `@UIApplicationMain`數組

 - Swift中,代碼都是寫到 `{}` 標識的代碼塊裏面閉包

 - 在 Swift 中,每一行代碼的末尾不用跟上 `;`app

 - OC 中的 initWithXXX 換成 `類名(XXX:__)` [init(XXX:)]ide

 - Swift 中使用 `點 .` 的方式去調用方法函數

 - Swift 枚舉分爲 `大類型.小類型`,並且大類型能夠省略url

 - Swift 中,當前類的屬性或者方法均可以不用 self. 開頭,建議你們不要加.由於在後面閉包的使用的時候,閉包裏面會使用 selfspa

 - Selector: 兩種表現形式 Selector("buttonClick") / 在要傳入 Selector 的地方 直接填寫 "buttonClick"code

 - 在 Swift 中使用 print 做打印語句

2.常量和變量

- 使用 `let` 定義常量

- 使用 `var` 定義變量

- 在 Swift 中,有 `自動推導`,會根據等號後面的值,推斷出前面變量(常量)的類型,也就是說,能夠不用顯式的去指定類型

- 在 Swift 中對類型檢測很是嚴格,沒有 `隱式轉換`,只有類型相同的變量(常量)才能進行運算

- option + click 查看變量(常量)類型

- let 與 var 如何選擇: 先使用 let 定義,若是須要更改的話,再變成 var

3.可選類型

        - fatal error: unexpectedly found nil while unwrapping an Optional value

        - 什麼是可選類型: 一個變量(常量)可能有值,可能爲nil,那麼它就是一個可選類型

        - 可選類型的變量不能直接進行運算 ,要強制解包(使用 !) 或者判斷其是否有值再計算

        - 使用 `?` 標識變量是一個可選類型的變量

        - 輸出的時候若是發現 `Optional(xxx)` 字樣,表明打印的變量是一個可選類型

        - `!` 用於標識可選類型的變量必定有值 [解包] (程序員向系統保證 ,a 裏面必定有值,你去取a的值去計算,若是沒有取到值,系統就會崩潰)

        - 咱們在使用 `!` 的時候,必定要當心,要確保其修飾的變量必定有值,

        - `??` 空合併運算符,判斷其前面的可選值是否真的有值,若是有,就直接返回該值,若是爲nil,就使用 其後面的值進行運算

4.if語句

    - 條件語句能夠不使用 `()` 圓括號括起來

        - `{}` 執行代碼塊的花括號不能省略

        - 在 Swift 中是沒有`非0即真`概念,條件語句只能有 true/false

        let a = 10
        
        // 判斷 a 是否大於5, 若是大於5,就打印一句話
        if a > 5 {
            print("a 大於 5")
        }   
        // 方式1
        // 運算符的左右空格必定要對稱 (空格大法)
        if url != nil{
            let request = NSURLRequest(URL: url!)
            print(request)
            // 若是下面有不少代碼,而且屢次使用 url ,都須要強行解包
        }
        
        // 方式2: 使用 if let
        // if let 會判斷 url 是否有值,若是沒有值,什麼都不錯
        // 若是有值,會把 url 的值取出來賦值給 u,而且進入到 if 的執行代碼塊中
        if let u = url {
            let request = NSURLRequest(URL: u)
            print(request)
        }    

if let 與 guard let

    func demo6(){
//        let url = NSURL(string: "http://www.baidu.com")
//        
//        if let u = url {
//            let request = NSURLRequest(URL: u)
//            print(request)
//            // 寫不少邏輯
//        }
        
        let url = NSURL(string: "http://www.qq.com")
        guard let u = url where u.host == "www.baidu.com" else {
            print("url爲空或者不符合條件")
            return
        }
        let request = NSURLRequest(URL: u)
        print(request)
        
    }

5.switch

let scoreStr = ""
        switch scoreStr {
        case "":
            print("大於等於90小於等於100")
        case "":
            print("大於等於80小於90")
        case "":
            print("大於等於60小於80")
        case "":
            print("大於等於0小於60")
        default:
            print("其餘")
        }
        
        // 判斷一個範圍
        let score = 95
        switch score {
        case _ where score >= 90 && score <= 100:
            print("")
        case let s where s < 90 && s >= 80:
            print("")
        case let s where s < 80 && s >= 60:
            print("")
        case let s where s < 60:
            print("")
        default:
            print("其餘")
        }

6.循環

        // 方式1: 仿照oc寫
//        for (int i=0; i<3; i++) {
//            NSLog(@"哈哈");
//        }
        for var i = 0; i < 3; i++ {
            print(i)
        }
        
        print("==========")
        // 方式2: for in
        for i in 0..<3 {
            print(i)
        }
        
        print("==========")
        for i in 0...3 {
            print(i)
        }
        
        
        print("==========")
        
        // 方式3: 只須要遍歷的次數,不須要當前遍歷到哪一個位
        
        for _ in 0..<3 {
            print("哈哈")
        }
//        var i = 10
//        while i > 0 {
//            i--
//            print(i)
//        }
        
        
        var i = 10
        // do while 在 Swift 2.0 Xcode 7.0 beta5 
        // 改爲repeat while
        repeat {
            i--
            print(i)
        }while (i > 0)

7.字符串

    /// 字符串的截取
    func demo4(){
        
        let str = "據說下雨天音樂和辣條更配喲"
        
        // 截取: 下雨天音樂和辣條更配喲
        let r1 = str.substringFromIndex(str.startIndex.advancedBy(2))
        print(r1)
        
        // 截取: 據說下雨天音樂和辣條更
        let r2 = str.substringToIndex(str.endIndex.advancedBy(-2))
        print(r2)
        
        
        // 截取: 下雨天音樂和辣條更
        let startIndex = str.startIndex.advancedBy(2)
        let endIndex = str.endIndex.advancedBy(-2)
        let r3 = str.substringWithRange(startIndex..<endIndex)
        print(r3)
        
        
        // 若是以上的代碼不會寫,能夠把 String 轉成 NSString 進行截取
        let range = NSMakeRange(2, str.characters.count - 4)
        let r4 = (str as NSString).substringWithRange(range)
        print(r4)
        
    }
    
    /// 字符串的拼接
    func demo3(){
        
        let name = "老王"
        let age = 18
        // 打印出:我叫老王年齡18
        
        
        // 方式1: 使用 `+`
        let r1 = "我叫" + name + "年齡" + String(age)
        print(r1)
        
        // 方式2: 使用 `\(_常量或者變量名_)`
        let r2 = "我叫\(name)年齡\(age)"
        print(r2)
        
        
        // 使用 formatter 的狀況
        
        let h = 9
        let m = 10
        let s = 3
        
        // 輸出 09:10:03
        
        let r3 = String(format: "%02d:%02d:%02d", h, m, s)
        print(r3)
        
        let r4 = String(format: "%02d:%02d:%02d", arguments: [h, m, s])
        print(r4)
        
    }
    
    /// 字符串的長度獲取
    func demo2(){
        let str = "別哭泣,老王會笑"
        // 獲取字符串的長度
        print(str.characters.count)
        print(str.utf8.count)
        print(str.lengthOfBytesUsingEncoding(NSUTF8StringEncoding))
    }


    /// 字符串的遍歷
    func demo1(){
        let str = "別低頭,綠帽會掉"
        for value in str.characters {
            print(value)
        }
    }
View Code

8.集合

// 合併字典
    func demo7(){
        var dict1 = ["name": "老王", "age": 18]
        let dict2 = ["no": "哈哈", "height": 180, "name": "老李"]
        
        for (k,v) in dict2 {
            dict1[k] = v
        }
        print(dict1)
    }
    
    
    /// 遍歷字典
    func demo6(){
        let dict = ["name": "老王", "age": 18]
        for (k,v) in dict {
            print("key:\(k);value:\(v)")
        }
    }
    
    /// 字典的定義以及初始化
    /**
        - 使用 let 定義不可變的字典,使用 var 定義可變的字典
    */
    func demo5(){
        // 類型: [String : NSObject]
//        let dict1 = ["name": "老王", "age": 18]
//        print(dict1)
        
        // 初始化一個空字典
        var dict2 = [String : NSObject]()
        dict2["name"] = "老王"
        dict2["age"] = 18
        print(dict2)
        
        // 這種方式賦值的話,若是字典裏面存對應key的鍵值對的話,會覆蓋掉原來的值
        dict2["name"] = "老李"
        print(dict2)
        
//        // 取值
//        let r1 = dict2["name"]
//        print(r1)
        
        // 移除值
        dict2["name"] = nil
        print(dict2)
    }
    
    // 數組的容量,容量就表明數組可以裝多少元素
    func demo4(){
        
        var array = [Int]()
        for i in 0..<128 {
            array.append(i)
            // 打印array的容量
            print("當前count:\(array.count),容量是:\(array.capacity)")
        }
    }
    
    // 數組的合併
    func demo3(){
        var array1 = ["老王", "老張"]
        let array2 = ["老李", "小尹"]
        
        array1 += array2
        print(array1)
        
//        let result = array2 + array1
//        print(result)
    }
    
    // 數組的遍歷
    func demo2(){
        let array = ["老王", "老張", "老李"]
        
        // 方式1:
        for var i = 0; i < array.count; i++ {
            print(array[i])
        }
        
        print("============")
        // 方式2: for in
        
        for value in array {
            print(value)
        }
        
        // 方式3:
        for (index, value) in array.enumerate() {
            print("index=\(index);value=\(value)")
        }
    }

    /// 數組的定義,初始化
    /**
        - 使用 let 定義不可變數組,使用 var 定義可變數組

    */
    func demo1(){
        
//        var a = ["老王", 10]
//        a.append(NSValue(CGRect: CGRectZero))
        
//        var a = [CGRectZero, CGRect(x: 0, y: 0, width: 10, height: 10)]
//         a.append(CGRectZero)
        
        
        // 定義一個數組
        let array1 = ["老王", "老李", "老張"]
        
        print(array1)
        // 定義一個空數組
        var array2: [Int] = [Int]()
        // 添加元素
        array2.append(1)
        array2.append(2)
        array2.append(3)
        print(array2)
        
        // 數組取值
        print(array2[0])
        
        // 移除值
        array2.removeFirst()
        print(array2)
    }
View Code

9.函數

 override func viewDidLoad() {
        super.viewDidLoad()
        // demo1()
        // sum1(10, b: 5)
        // sum2(num1: 4, num2: 6)
        
//        let result = sum3(num1: 5, num2: 7)
//        print(result)
        
        demo()
        
    }


    // 任務1: 定義一個沒有參數沒有返回值的函數
    // 格式: func 函數名() { __函數執行代碼__ }
    func demo1(){
        print("哈哈")
    }
    
    
    // 任務1: 定義一個有參數沒有返回值的函數
    // Swift中函數的第一參數名字在調用的時候默認省略
    // 格式: func 函數名(形參名1: 類型, 形參名2: 類型, ...) { __函數執行代碼__ }
    func sum1(a: Int, b: Int) {
        print(a + b)
    }
    
    // 帶有外部參數的函數
    // 格式: func 函數名(外部參數名1 形參名1: 類型, 外部參數名2 形參名2: 類型, ...) { __函數執行代碼__ }
    func sum2(num1 a: Int, num2 b: Int) {
        print(a + b)
    }
    /// 定義一個有參數有返回值的函數(有外部參數的函數)
    // 格式: func 函數名(外部參數名1 形參名1: 類型, 外部參數名2 形參名2: 類型, ...) -> 返回值類型 { __函數執行代碼__ }
    func sum3(num1 a: Int, num2 b: Int) -> Int {
        return a + b
    }
    
    // 沒有返回值的3種表現形式
    
    // 方式1
    func demoAA(){
        
    }
    
    // 方式2
    func demoBB() -> Void {
        
    }
    
    // 方式3
    func demoCC() -> () {
        
    }
    
    
    // 嵌套函數
    func demo(){
        // 做用範圍是在當前 demo 的函數體內
        func haha(){
            print("哈哈")
        }
        
        haha()
    }
View Code

10.閉包

    override func viewDidLoad() {
        super.viewDidLoad()
        demo3A()
        demo3B()
    }
    
    // MARK: - 定義一個有參數有返回值的閉包
    
    // 任務3: 定義一個有參數有返回值的閉包
    func demo3B(){
        // 閉包的類型: (num1: Int, num2: Int) -> Int
        let clourse = { (num1 a: Int, num2 b: Int) -> Int in
            return a + b
        }
        
        let result = clourse(num1: 5, num2: 6)
        print(result)
        
    }
    
    
    // 內部定義一個有參數有返回值的函數
    func demo3A(){
        
        func sum(num1 a: Int, num2 b: Int) -> Int {
            return a + b
        }
        
        let result = sum(num1: 5, num2: 6)
        print(result)
    }
    
    // MARK: - 定義一個有參數沒有返回值的閉包
    
    // 任務2: 定義一個有參數沒有返回值的閉包
    func demo2B(){
        
        // 有參數沒有返回值的閉包類型: (num1: Int, num2: Int) -> ()
        let clourse = { (num1 a: Int, num2 b: Int) in
            print(a + b)
        }
        
        clourse(num1: 10, num2: 1)
    }
    
    
    // 內部定義一個有參數沒有返回值的函數
    func demo2A(){
        
        func sum(num1 a: Int, num2 b: Int) {
            print(a + b)
        }
        sum(num1: 10, num2: 1)
    }
    
    // MARK: - 定義一個沒有參數沒有返回值的閉包
    
    
    // 任務1: 定義一個沒有參數沒有返回值的閉包
    func demo1B(){
        // 沒有參數沒有返回值的閉包的類型: () -> ()
        let clourse = {
            print("哈哈")
        }
        clourse()
        
        
        // 定義一個函數,將上面的閉包做爲參數傳入
//        func haha(callback: () -> ()) {
//            callback()
//        }
    }
    
    // 內部定義一個沒有參數沒有返回值的函數
    func demo1A(){
        func haha(){
            print("哈哈")
        }
        haha()
    }
    
    // MARK: - 沒有返回值的三種狀況
    
    // 若是閉包沒有參數沒有返回值
    
    func demo1(){
        let clourse1 = { (num1 a: Int, num2 b: Int) -> () in
            print("哈哈")
        }
        
        let clourse2 = { (num1 a: Int, num2 b: Int) -> Void in
            print("哈哈")
        }
        
        let clourse3 = { (num1 a: Int, num2 b: Int) in
            print("哈哈")
        }
        
        
    }
相關文章
相關標籤/搜索