麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

Swift3.0從入門到放棄(四)-基礎最終篇

2019-11-08 00:30:38
字體:
來源:轉載
供稿:網友
Swift中的閉包 閉包衍生的循環引用問題閉包循環引用問題另一種解決寫法(簡便寫法)尾隨閉包Swift中的懶加載Swift中的訪問權限Swift中零散知識點Swift3.0小案例

Swift中的閉包

Swift中的閉包和OC中的block大致相同,OC中的block相當于匿名函數,而Swift中的閉包也相當于特殊的函數。 閉包的數據類型格式為: (參數列表) -> (返回值類型) 下面用一個異步網絡請求的案例來簡單使用一下閉包:首先創建模擬網絡請求類??import UIKit// 模擬網絡工具類class HWHttpTools: NSObject { // 模擬網絡工具類提供的網絡請求接口函數 // 注意點: 1.Swift中閉包的參數必須設置為內部參數(在參數名前加上下劃線) // 2.閉包中多個參數用逗號隔開 // 3.Swift3.0中GCD異步函數的寫法發生改變 DispatchQueue.global().async { 異步執行代碼塊 } // 4.Swift3.0中查看當前線程 Thread.current // 5.如下,Swift3.0中如果在當前函數內直接調用閉包就不需要加 @escaping 來修飾閉包;但是如果在其他閉包內調用,就必須在閉包前面添加 @escaping(逃逸)關鍵字 func requestWith(url : String, _ finishedCallBlock : @escaping (_ succeed : Bool, _ data : Data?)->()) { // 發起異步請求 DispatchQueue.global().async { 閉包衍生的循環引用問題在上面的案例中,我們故意在控制器閉包回調中添加一句更改view視圖背景顏色的代碼,看看是否會發生循環引用問題。(我們把網絡工具類對象設置成控制器的一個強引用屬性)import UIKitclass ViewController: UIViewController { // 網絡工具類屬性 var httpTools : HWHttpTools? override func viewDidLoad() { super.viewDidLoad() } // 點擊屏幕 發送網絡請求 override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { // 網絡工具類屬性賦值 httpTools = HWHttpTools() httpTools?.requestWith(url: "服務器url字符串") { (succeed : Bool, data : Data?) in // 更改了view視圖的背景顏色 // 在閉包內調用當前類的屬性,必須加 self. // 那么在這個閉包中調用了self會不會發生循環引用? // *** 答案是否定的,當前控制器強引用工具類對象,閉包強引用當前控制器,但是工具類對象并沒有強引用閉包,所以并不會發生循環引用。*** self.view.backgroundColor = UIColor.red } }}但是萬一在閉包中發生了循環引用問題,在Swift當中我們應該怎么處理呢?首先我們先讓工具類對象強引用閉包。??import UIKit// 模擬網絡工具類class HWHttpTools: NSObject { var finishedCallBlock : ((_ succeed : Bool, _ data : Data?)->())? func requestWith(url : String, _ finishedCallBlock : @escaping (_ succeed : Bool, _ data : Data?)->()) { // 強應用閉包 self.finishedCallBlock = finishedCallBlock // 發起異步請求 DispatchQueue.global().async { print("發起異步請求 - /(Thread.current)") // 回到主線程 DispatchQueue.main.async { print("請求成功回到主線程 - /(Thread.current)") // 閉包回調 finishedCallBlock(true, nil) } } }}然后再控制器中出現循環引用,我們采取使用在閉包外部將控制器self賦值給weak修飾的變量來阻斷閉包對控制器的強引用。??import UIKitclass ViewController: UIViewController { // 網絡工具類屬性 var httpTools : HWHttpTools? override func viewDidLoad() { super.viewDidLoad() } // 點擊屏幕 發送網絡請求 override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { // 網絡工具類屬性賦值 httpTools = HWHttpTools() // 注意: weak修飾的標識符可能為nil,所以weakSelf為可選類型 // 注意: weak只能修飾變量 weak var weakSelf = self httpTools?.requestWith(url: "服務器url字符串") { (succeed : Bool, data : Data?) in weakSelf?.view.backgroundColor = UIColor.red } }}

閉包循環引用問題另一種解決寫法(簡便寫法)

import UIKitclass ViewController: UIViewController { // 網絡工具類屬性 var httpTools : HWHttpTools? // 點擊屏幕 發送網絡請求 override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { // 網絡工具類屬性賦值 httpTools = HWHttpTools() // 解決循環引用的方式二 在閉包的{}大括號內的開頭 寫上[weak self] 然后再比包內使用 self 就不會發生循環引用,切記這時閉包內使用的 self 為可選類型。 // 以上寫法相當于在閉包外部寫上 weak var weakSelf = self,然后在閉包內部使用 weakSelf 替代 self 原理一樣。 httpTools?.requestWith(url: "服務器url字符串") { [weak self] (succeed : Bool, data : Data?) in self?.view.backgroundColor = UIColor.red } } // 析構函數 deinit { print("控制器銷毀") }}PS : 還有一種寫法是將上面的 [weak self] 改寫成 [unowned self] 效果是一樣的,但是使用 unowned 是很危險的容易出現操作野指針,unowned 的意思跟OC當中的__unsafe_unretained一樣 只不過保證 self 不被銷毀就可以安全使用。

尾隨閉包

當函數參數中的閉包參數是最后一個,在函數調用時閉包參數整個大括號可以寫在參數列表小括號外面(緊跟在后面)// 寫法一HWHttpTools().function(name: "參數一", { // 閉包代碼塊})// 寫法二 尾隨閉包HWHttpTools().function(name: "參數一") { // 閉包代碼塊}當函數只有一個參數,且是閉包參數,那么可以在函數調用的時候省去()小括號,如下3種寫法均可:HWHttpTools().function({ //普通寫法})HWHttpTools().function() { // 尾隨閉包寫法}HWHttpTools().function { // 省略小括號的尾隨閉包寫法 }

Swift中的懶加載

懶加載特性 : 1.用到時才會加載;2.程序運行過程中只會創建一次在OC中的懶加載我們通常是通過重寫其getter方法來實現的,但是在Swift中專門提供了一個關鍵字 lazy 來修飾懶加載屬性,具體寫法如下:lazy var names : [String] = Array() // 懶加載數組寫法一lazy var items : [String] = { // 懶加載數組寫法二 let items : [String] = Array() return items}()在開發中,很多控件也使用懶加載,用到即加載到內存中。lazy var btn : UIButton = UIButton() // 只是為了初始化控件 不進行其他設置的懶加載寫法lazy var btn : UIButton = { let btn = UIButton() // 懶加載設置其他屬性寫法 btn.setTitle("按鈕", for: .normal) btn.setBackgroundImage(UIImage(named: "xx.png"), for: .normal) return btn}()

Swift中的訪問權限

在Swift3.0中規定訪問權限的關鍵詞有 internal 、 open、 private、 fileprivate。這些訪問權限關鍵詞不僅可以修飾屬性,也可以修飾方法和類。internal : 默認修飾詞(屬性、類、方法默認權限修飾詞),表示在同一個模塊(target、項目、資源包)中都能夠訪問。open : 表示跨項目(target、項目、資源包)都能夠使用。private : 表示只能在當前類中訪問。fileprivate : 表示只能在當前文件中使用。

Swift中零散知識點

1.在Swift開發中,并不是所有的方法都寫在一個類中,這樣可讀性也不會很好。如果能夠靈活運用延展,就可以有效提高代碼的可讀和美觀性。但是注意 : 在延展中的方法不能用private修飾,不然在當前類中也無法訪問,只能在延展中使用,但是可以用fileprivate修飾。2.在Swift開發中,監聽方法若用 private 或 fileprivate 修飾必須前面加上 @objc 修飾詞。(什么是監聽方法 : 比如寫在#selector()里面的按鈕的監聽方法)3.在Swift中分欄注釋(提高代碼閱讀性) // MARK: info ,類似于OC項目中的 #pragma mark - info 的作用。

Swift3.0小案例

小案例目的在于綜合運用Swift3.0寫一個頁面,中間設計網絡請求、控件搭建、圖片加載、轉換數據模型等。

源代碼地址 : https://github.com/IMLoser/Swift3.0_Demo

Swift3.0小案例


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 色婷婷久久久 | 九色91视频 | 激情视频免费观看 | 一区二区三区在线观看视频 | 精品中文字幕在线观看 | 欧美一级毛片免费观看 | 九一国产精品 | 成人在线免费小视频 | 国产亚洲精彩视频 | 一级全毛片 | 国产精品999在线 | 精品在线视频观看 | av成人在线电影 | 精品国产一区二区三区免费 | 欧美成年人视频 | 国产乱淫a∨片免费观看 | 免费国产一级特黄久久 | 欧美日韩在线视频一区 | 国产午夜免费不卡精品理论片 | 在线观看视频亚洲 | avlululu| 久久久久久久久久美女 | 国产成人精品一区在线播放 | 99精彩视频在线观看 | 日韩视频一二区 | 国产精品久久久久久久久久了 | 黑人三级毛片 | 久久久成人动漫 | 欧美三日本三级少妇三级99观看视频 | omofun 动漫在线观看 | 91av亚洲| 舌头伸进添的我好爽高潮网站 | 一区二区三区欧美在线 | 亚洲精华液久久含羞草 | 9999久久久久久 | 草莓福利社区在线 | 久久久免费观看完整版 | 久久国产精品无码网站 | 久久久久久久一区二区三区 | 一级免费a| 成人免费看视频 |