亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

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

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小案例


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美激情视频在线观看| 国产精品99久久久久久久久久久久| 国产精品久久久久久久久久久久久| 亚洲在线观看视频网站| 久久久久久久激情视频| 国产精品色午夜在线观看| 国产69精品久久久久久| 日韩精品视频观看| 精品成人乱色一区二区| 亚洲黄色av网站| 亚洲va电影大全| 色综合久久天天综线观看| 91视频国产一区| 久久久久久久久久久久久久久久久久av| 亚洲欧洲中文天堂| 欧美最猛性xxxx| 国产主播欧美精品| 亚洲黄在线观看| 欧美激情a∨在线视频播放| 亚洲综合国产精品| 欧美二区在线播放| 热久久美女精品天天吊色| 中文在线资源观看视频网站免费不卡| 欧美成人免费一级人片100| 亚洲成人久久网| 91精品国产乱码久久久久久久久| 欧美激情一二三| 91久久国产综合久久91精品网站| 亚洲电影免费观看高清完整版| 久久久久久久久久久av| 欧美视频不卡中文| 欧美日韩性视频| 亚洲国产精品免费| 欧美丰满少妇xxxx| 性亚洲最疯狂xxxx高清| 狠狠久久亚洲欧美专区| 亚洲高清福利视频| 久久视频国产精品免费视频在线| 精品无码久久久久久国产| 国产噜噜噜噜噜久久久久久久久| 精品视频在线播放| 成人午夜一级二级三级| 日韩精品免费在线观看| 都市激情亚洲色图| 国产精品一区av| 精品日韩美女的视频高清| 中文字幕欧美专区| 欧美精品18videosex性欧美| 亚州欧美日韩中文视频| 97久久伊人激情网| 亚洲成在人线av| 4438全国亚洲精品在线观看视频| 俺去亚洲欧洲欧美日韩| 久久夜色精品国产亚洲aⅴ| 午夜免费久久久久| 亚洲人a成www在线影院| 久久免费视频在线| 日韩美女写真福利在线观看| 国产精品视频永久免费播放| 国产精品视频久久久| 亚洲一区二区三区香蕉| 91精品视频播放| 国产精品久在线观看| 91成人国产在线观看| 久久精品成人欧美大片| 青青在线视频一区二区三区| 精品国产999| 性色av一区二区三区免费| 欧美xxxwww| 亚洲精品一区中文| 亚洲精品在线观看www| 国产成人综合久久| 欧美丝袜一区二区| 日韩中文字幕视频| 国产精品视频免费在线| 国产成人综合一区二区三区| 国产精品劲爆视频| 成人激情视频小说免费下载| 中文字幕亚洲专区| 欧美风情在线观看| 午夜精品福利在线观看| 国产精品高精视频免费| 亚洲人成电影在线观看天堂色| 国产美女久久精品| 国产亚洲欧美一区| 欧洲永久精品大片ww免费漫画| 亚洲黄一区二区| 这里只有视频精品| 日韩视频永久免费观看| 自拍视频国产精品| 国产福利精品在线| 91亚洲国产成人精品性色| 秋霞午夜一区二区| 一个人看的www欧美| 亚洲欧洲自拍偷拍| 亚洲人成在线观| 精品国产乱码久久久久酒店| 亚洲黄色成人网| 亚洲最大中文字幕| 国产精品久久久久av免费| 国产精自产拍久久久久久| 欧美性极品少妇精品网站| 久久97久久97精品免视看| 欧美日韩一区二区在线播放| 欧美老女人性视频| 538国产精品一区二区在线| 国产一区二区三区在线播放免费观看| 午夜精品久久久99热福利| 色婷婷av一区二区三区在线观看| 国产精品爽爽爽| 国产精品爽爽爽爽爽爽在线观看| 亚洲伊人一本大道中文字幕| 日韩在线免费视频观看| 色黄久久久久久| 国产精品夫妻激情| 国产精品第三页| 国产国语刺激对白av不卡| 欧美—级高清免费播放| 国产精品视频免费观看www| 97精品在线观看| 亚洲成人av中文字幕| 国产精品久久久久久久久久久不卡| 国产aaa精品| 国产精品日韩欧美大师| 国产亚洲精品久久久久久777| 久久久伊人日本| 91中文精品字幕在线视频| 亚洲精品电影网在线观看| 在线日韩中文字幕| 91精品视频网站| 亚洲国产精品一区二区三区| 亚洲欧美国产一区二区三区| 国产精品视频一区二区三区四| 亚洲成色999久久网站| 97视频国产在线| 亚洲精品国产综合久久| 亚洲а∨天堂久久精品9966| 久久激情五月丁香伊人| 久久久综合免费视频| 中文字幕亚洲欧美日韩2019| 亚洲美女性生活视频| 欧美精品一二区| 在线性视频日韩欧美| www.日韩不卡电影av| 亚洲欧美国产制服动漫| 亚洲xxxxx电影| 68精品久久久久久欧美| 日韩av色在线| 欧美孕妇毛茸茸xxxx| 国产一区二区三区欧美| 欧美午夜激情视频| 久久久久久久久久久免费精品| 国产91九色视频| 国产精品女视频| 日韩精品视频免费在线观看| 1769国产精品| 国产有码在线一区二区视频| 日韩三级成人av网| 日韩高清免费观看| 久久久日本电影| 日本高清久久天堂| 懂色av中文一区二区三区天美| 最近2019好看的中文字幕免费| 亚洲色图第一页|