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) } }
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) }
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() }
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("哈哈") } }