Swift 文档读后随写
一. 常量&變量
簡單體驗
// 定義變量 var i = 10 print(i) i = 15 print(i)let j = 20 // 常量一經(jīng)定義不能自改數(shù)值 // j = 25 print(j) 復制代碼- 階段性小結(jié)
- var 定義變量,設(shè)置之后可以修改
- let 定義常量,設(shè)置之后不可以修改
- 語句末尾不用使用 ;
- 在 Swift 中使用 print() 替代 OC 中的 NSLog
- print 的性能更好,后面會演示
定義 OC 對象
// 實例化視圖 let v = UIView(frame: CGRectMake(0, 0, 100, 100)) // 設(shè)置背景顏色 v.backgroundColor = UIColor.redColor()// 添加到根視圖 view.addSubview(v) 復制代碼- 階段性小結(jié)
- 在 Swift 中要實例化一個對象可以使用 類名() 的格式,與 OC 中的 alloc/init 等價
- OC 中的 initWithXXX 在 Swift 中通常可以使用 類名(XXX: ) 找到對應(yīng)的函數(shù)
- OC 中的 [UIColor redColor] 類方法,在 Swift 中通常可以使用 類名.XXX 找到對應(yīng)的函數(shù)
- 使用 let 修飾 v 并且賦值,表示 該常量的內(nèi)存地址不允許修改,但是可以修改其內(nèi)部的屬性
- 當前對象的屬性,不需要使用 self.
常量&變量的使用原則:盡量先用 let,只有需要變的時候,再用 var,能夠更加安全
變量類型
let x = 10 let y = 10.5 let z: Double = 20print(Double(x) + y) print(x + Int(y)) print(y + z) 復制代碼- 階段性小結(jié)
- 初次接觸 Swift 中會因為簡單的 var let 誤以為 Swift 中的類型非常松散
- 其實所有變量的準確類型都是在賦值的同時自動推導的
- Swift 是對類型要求非常嚴格的一門語言,一個值永遠不會被自動轉(zhuǎn)換成其他類型
- 如果要轉(zhuǎn)換,必須顯示轉(zhuǎn)換,Swift 中
- 小數(shù)默認是 Double 類型
- 整數(shù)默認是 Int 類型
- 如果要顯式的指定變量的類型,可以在定義是使用 var 變量名: 類型 = 值
二. 邏輯分支
簡單體驗
var i = 10if i > 0 {print("OK") } 復制代碼- 階段性小結(jié)
- Swift 中沒有 C 語言中的非零即真概念
- 在邏輯判斷時必須顯示地指明具體的判斷條件
- if 語句條件的 () 可以省略
- 但是 {} 不能省略
三目
var a = 10 var b = 50var result = a > b ? a : b print(result) 復制代碼- 階段性小結(jié)
- Swift 中的 三目 運算保持了和 OC 一致的風格
可選項
演練 1
let url = NSURL(string: "http://www.520it.com/")if url != nil {NSURLSession.sharedSession().dataTaskWithURL(url!, completionHandler: { (data, _, _) -> Void inprint(NSString(data: data!, encoding: NSUTF8StringEncoding))}).resume() } 復制代碼- 階段性小結(jié)
- 在 Swift 中,不是所有的對象實例化方法都會返回值,在實際開發(fā)中需要注意實例化函數(shù)的返回類型,例如:
Swift 的設(shè)計者考慮到因為對類型的強制要求,會讓代碼很難看,因此提供了一個變通的解決方案
演練 2
if let url = NSURL(string: "http://520it.com") {NSURLSession.sharedSession().dataTaskWithURL(url, completionHandler: { (data, _, _) -> Void inprint(NSString(data: data!, encoding: NSUTF8StringEncoding))}).resume() } 復制代碼-
階段性小結(jié)
- 使用 if let 常量 = 可選構(gòu)造函數(shù) 的方式能夠確保分支內(nèi)部常量一定是有值的
- 并且在分支內(nèi)部不再需要使用 !
- 這是 Swift 代碼中的一個非常重要的使用技巧
-
提示
- 盡管 Swift 提供了類型校驗的手段,但是要寫出 優(yōu)雅 的 Swift 代碼,還是需要多加練習的,否則一不小心就會出現(xiàn)分支嵌套層次很深的代碼
- 有關(guān) ? 和 ! 的選擇,可以借助 Xcode 的輔助工具,但是強烈建議每次遇到提示時,要多加思考,反復揣摩
演練3
var name: String? print(name?.lengthOfBytesUsingEncoding(NSUTF8StringEncoding))name = "lnj" print(name?.lengthOfBytesUsingEncoding(NSUTF8StringEncoding))let l = 10 print(l + (name?.lengthOfBytesUsingEncoding(NSUTF8StringEncoding) ?? 0)) 復制代碼- 階段性小結(jié)
- ?? 是一個非常有用的操作符,能夠快速對 nil 進行判斷
- 如果對象是 nil,則使用 ?? 后面的值代替前面的 nil 值參與計算
- 在使用 ?? 時,整個部分需要使用 () 包裝
- 這一技巧在 UITableView 的數(shù)據(jù)源方法中尤為重要
三. 循環(huán)
OC風格的 for
// 傳統(tǒng)寫法 for var i = 0; i < 10; i++ {print(i) } 復制代碼Swift風格的 for
// 遍歷 0 ~ <10 for i in 0..<10 {print(i) }print("---")// 遍歷 0 ~ 10 for i in 0...10 {print(i) } 復制代碼- 階段性小結(jié)
- Swift 中使用 in 關(guān)鍵字標示循環(huán)的范圍
- 0..<10 表示從0到9
- 0...10 表示從0到10
- 注意之間不能出現(xiàn)空格
特殊寫法
for _ in 0...10 {print("hello") } 復制代碼- 階段性小結(jié)
- 如果不關(guān)心循環(huán)本身的索引,可以使用 _ 忽略
- 這一技巧在之前的分支演練中出現(xiàn)過
四. 字符串
在 Swift 中絕大多數(shù)的情況下,推薦使用 String 類型
使用 String 的原因
- String 是一個結(jié)構(gòu)體,性能更高
- String 目前具有了絕大多數(shù) NSString 的功能
- String 支持直接遍歷
- NSString 是一個 OC 對象,性能略差
- Swift 提供了 String 和 NSString 之間的無縫轉(zhuǎn)換
遍歷字符串
let str = "我要飛的更High"for s in str {print(s) } 復制代碼字符串拼接
let str1 = "zhangsan" let str2 = "lisi" let i = 10print(str1 + str2) print("\(str1) \(str2) \(i)") 復制代碼- 階段性小結(jié)
- 直接在 "" 中使用 \(變量名) 的方式可以快速拼接字符串
- 小伙伴們再也不要考慮 stringWithFormat 了
格式化字符串
for _ in 0...10 {let str = String(format: "zhangsan - %04d", arguments: [arc4random_uniform(100)])print(str) } 復制代碼- 階段性小結(jié)
- 在實際開發(fā)中,如果需要指定字符串格式,可以使用 String(format:...) 的方式
- 注意:后面的參數(shù)需要放在一個數(shù)組中
String & Range 的結(jié)合
以下是超級費勁的代碼
let str: String = "我要飛的更High"var subStr = str.substringWithRange(Range<String.Index>(start: str.startIndex, end: str.endIndex)) print(subStr) 復制代碼建議寫法
let str1: NSString = "我要飛的更High" print(str1.substringWithRange(NSMakeRange(0, 3))) 復制代碼五. 數(shù)組
簡單體驗
let arr = ["zhangsan", "lisi"] print(arr)// 遍歷每一個元素 for a in arr {print(a) }// 像 OC 一樣打印 print(arr as NSArray)復制代碼數(shù)組中保存的對象類型
// 數(shù)組中保存的都是字符串 let arr = ["zhangsan", "lisi"]// 數(shù)組中保存的是 NSObject let arr1 = ["zhangsan", 1] 復制代碼- 階段性小結(jié)
- 數(shù)組使用 [] 定義,這一點與 OC 相同
- 如果初始化時,所有內(nèi)容類型一致,擇數(shù)組中保存的是該類型的內(nèi)容
- 如果初始化時,所有內(nèi)容類型不一致,擇數(shù)組中保存的是 NSObject
常見數(shù)組操作
// 定義只能保存字符串類型數(shù)組 var array: [String]// 初始化數(shù)組 array = ["zhangsan"]// 添加元素 array.append("lisi")print(array)// 刪除元素 array.removeAtIndex(1) print(array)// 刪除所有元素 array.removeAll(keepCapacity: true) print(array.capacity)// 注意數(shù)組容量的變化 for i in 0..<10 {array.append("\(i)")print("\(array) --- \(array.capacity)") }// 實例化新的數(shù)組 var array2 = [String]() array2.append("1") array2.append("2")// 拼接數(shù)組 array += array2print(array) 復制代碼- 階段性小結(jié)
- 如果定義數(shù)組時指定了保存對象的類型,擇不能向數(shù)組中添加其他類型的內(nèi)容
- 可以使用 [String]()
- let 定義的數(shù)組是不可變的
- var 定義的數(shù)組是可變的
六.字典
/// 定義并實例化字典 var dict = [String: AnyObject]()dict["name"] = "zhangsan" dict["age"] = 18print(dict)// 設(shè)置相同 key,之前的數(shù)值會被覆蓋 dict["name"] = "lisi" print(dict)// 刪除某一個 key dict.removeValueForKey("age") print(dict)dict["title"] = "manager" print(dict)// 遍歷字典(k, v可以隨便寫) for (k, v) in dict {print("\(k) -- \(v)") }// 合并字典 var dict2 = ["name": "wangwu", "age": 80, "title": "boss"] for (k, v) in dict2 {dict.updateValue(v, forKey: k) } print(dict) 復制代碼七. 函數(shù)
簡單演練
func sum(a: Int, b: Int) -> Int {return a + b } 復制代碼- 階段性小結(jié)
- 函數(shù)定義格式:func 函數(shù)名(參數(shù): 參數(shù)類型...) -> 返回值 { // 代碼實現(xiàn) }
- 如果沒有返回值, -> 返回值 可以省略
- -> 是一個很有意思的符號
- 默認情況下,在調(diào)用函數(shù)時,第一個參數(shù)名是省略的
參數(shù)名的特殊處理
強制要求參數(shù)名
func sum1(x a: Int, y b: Int) -> Int {return a + b } 復制代碼省略參數(shù)名
func sum2(a: Int, _ b: Int) -> Int {return a + b } 復制代碼八. 閉包
- 閉包定義
- 閉包簡化 - 尾隨閉包
- 閉包參數(shù)
- 閉包返回值
- 閉包的循環(huán)引用
九. 懶加載
lazy var demoView: UIView = {let v = UIView(frame: CGRectMake(10, 10, 100, 100))v.backgroundColor = UIColor.redColor()return v }() 復制代碼- 格式:
- 懶加載的寫法本質(zhì)上是定義并執(zhí)行一個閉包
十. getter & setter
自定義 Person 類
class Person: NSObject {var name: String?var age: Int? } 復制代碼getter & setter
var _name: String?var name: String? {get {return _name}set {_name = newValue} } 復制代碼- 在 Swift 中以上形式的 getter & setter 很少用
didSet
- 在 OC 中,我們通常希望在給某一個變量賦值之后,去做一些額外的操作
- 最經(jīng)典的應(yīng)用就是在自定義 Cell 的時候,通過模型的設(shè)置方法完成 Cell 的填充
計算型屬性
var title: String {get {return "Mr " + (name ?? "")} } 復制代碼- 只實現(xiàn) getter 方法的屬性被稱為計算型屬性,等同于 OC 中的 ReadOnly 屬性
- 計算型屬性本身不占用內(nèi)存空間
- 不可以給計算型屬性設(shè)置數(shù)值
- 計算型屬性可以使用以下代碼簡寫
構(gòu)造函數(shù)
init(dict: [NSObject: AnyObject]) {name = dict["name"] as? Stringage = dict["age"] as? Int } 復制代碼析構(gòu)函數(shù)
deinit {print("88") } 復制代碼十一. ATS 應(yīng)用傳輸安全
App Transport Security (ATS) lets an app add a declaration to its Info.plist file that specifies the domains with which it needs secure communication. ATS prevents accidental disclosure, provides secure default behavior, and is easy to adopt. You should adopt ATS as soon as possible, regardless of whether you’re creating a new app or updating an existing one.
If you’re developing a new app, you should use HTTPS exclusively. If you have an existing app, you should use HTTPS as much as you can right now, and create a plan for migrating the rest of your app as soon as possible.
強制訪問
<key>NSAppTransportSecurity</key> <dict><!--Include to allow all connections (DANGER)--><key>NSAllowsArbitraryLoads</key><true/> </dict> 復制代碼設(shè)置白名單
<key>NSAppTransportSecurity</key> <dict><key>NSExceptionDomains</key><dict><key>localhost</key><dict><key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key><true/></dict></dict> </dict> 復制代碼總結(jié)
以上是生活随笔為你收集整理的Swift 文档读后随写的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 02 选择排序
- 下一篇: 持续集成之 Jenkins 的安装与配置