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

首頁 > 編程 > Swift > 正文

在Swift中使用Cocoa的現有設計模式介紹

2020-03-09 17:52:20
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了在Swift中使用Cocoa的現有設計模式介紹,Cocoa是蘋果公司為Mac OS X所創建的原生面向對象的API,是Mac OS X上五大API之一,需要的朋友可以參考下
 

使用 Cocoa 現有的一些設計模式,是幫助開發者開發一款擁有合理設計思路、穩定的性能、良好的可擴展性應用的有效方法之一。這些模式都依賴于在 Objective-C 中定義的類。因為 Swift 與 Objective-C 的互用性,所以你依然可以在 Swift 代碼中使用這些設計模式。在一些情況下,你甚至可以使用 Swift 語言的特性擴展或簡化這些 Cocoa 設計模式,使這些設計模式更強大、更易于使用。

委托(Delegation)

在 Swift 和 Objective-C 中,委托通常由一個定義交互方法和遵循規范的委托屬性的協議表示。與 Objective-C 相比,當你在 Swift 中繼承一個委托時,雖然繼承模式不變,但是內部的實現已經改變了。就像在 Objective-C 中,在你向委托發送消息之前,不管它是不是 nil 你都會去查看,如果定義的方法是非必須實現的方法,不管委托有沒有實現這個方法,你也都會去查看。而在 Swift 中,通過保持類型安全的特性,可以有效的消除這些繁瑣、不必要的行為問題。

下面列出的代碼可以說明這個過程:

1.檢查 myDelegate 不為 nil。
2.檢查 myDelegate 是否實現了繼承的 window:willUseFullScreenContentSize: 方法。
3.如果myDelegate 不為 nil 并且實現了 window:willUseFullScreenContentSize: 方法4.那么調用該方法,將該方法的返回值分配給名為 fullScreenSize 的屬性。
將該方法的返回值輸出在控制臺。

 

復制代碼代碼如下:

// @inteface MyObject : NSObject
// @property (nonatomic, weak) id<NSWindowDelegate> delegate;
// @end
if let fullScreenSize = myDelegate?.window?(myWindow, willUseFullScreenContentSize: mySize) {
    println(NSStringFromSize(fullScreenSize))
}

 

注意: 在一個完全使用 Swift 編寫的 app 中,在定義 delegate 屬性時,它作為一個不定值的 NSWindowDelegate 對象,并將初始值設為 nil。

延遲初始化(Lazy Initialization)

你可以在 Lazy Stored Properties 中了解到更多關于延遲初始化的信息。

錯誤報告(Error Reporting)

Swift 中的錯誤報告模式沿用了 Objective-C 的模式,但 Swift 中不定值返回值的新特性給我們帶來了額外的好處。舉個很簡單的例子,你用 Bool 值作為一個函數的返回值,用于標識該函數是否執行成功,當你需要輸出錯誤信息時,你可以在函數中添加一個NSErrorPointer 類型的輸出參數 NSError。這個類型類似 Objective-C 中的 NSError **,并增加了內存安全性和非強制性的傳參。你可以使用 & 運算符作為前綴引用一個不定值 NSError 類型作為 NSErrorPointer 對象傳遞錯誤信息。如下面的代碼所示:

復制代碼代碼如下:

var writeError : NSError?
let written = myString.writeToFile(path, atomically: false,
    encoding: NSUTF8StringEncoding,
    error: &writeError)
if !written {
    if let error = writeError {
        println("write failure: /(error.localizedDescription)")
    }
}

 

當你實現自己的方法時,你需要配置一個 NSErrorPointer 對象,并將 NSErrorPointer 對象的 memory 屬性設為你創建的NSError 對象。首先檢查調用者傳遞的參數,確保它是一個非 nil 的 NSError 對象。
復制純文本新窗口

復制代碼代碼如下:

func contentsForType(typeName: String! error: NSErrorPointer) -> AnyObject! {
    if cannotProduceContentsForType(typeName) {
        if error {
            error.memory = NSError(domain: domain, code: code, userInfo: [:])
        }
        return nil
    }
    // ...
}

 

Target-Action模式(Target-Action)

當有特定事件發生,需要一個對象向另一個對象發送消息時,我們通常采用 Cocoa 的 Target-Action 設計模式。Swift 和 Objective-C 中的 Target-Action 模型基本類似。在 Swift 中,你可以使用 Selector 類型達到 Objective-C 中 selectors 的效果。請在Objective-C Selectors 中查看在 Swift 中使用 Target-Action 設計模式的示例。

類型匹配與統一規范(Introspection)

在 Objective-C 中,你可以使用 isKindOfClass: 方法檢查某個對象是否是指定類型,可以使用 conformsToProtocol: 方法檢查某個對象是否遵循特定協議的規范。在 Swift 中,你可以使用 is 運算符完成上述的功能,或者也可以使用 as? 向下匹配指定類型。

你可以使用 is 運算符檢查一個實例是否是指定的子類。如果該實例是指定的子類,那么 is 運算結果為 true,反之為false。

復制代碼代碼如下:

if object is UIButton {
    // object is of type UIButton
} else {
    // object is not of type UIButton
}

 

你也可以使用 as? 運算符嘗試向下匹配子類型,as? 運算符返回不定值,結合 if-let 語句使用。

復制代碼代碼如下:

if let button = object as? UIButton {
    // object is successfully cast to type UIButton and bound to button
} else {
    // object could not be cast to type UIButton
}

 

請在 Type Casting 中查看更多信息。

檢查匹配協議的語法與檢查匹配類的語法是一樣的,下面是使用 as? 檢查匹配協議的示例:

復制代碼代碼如下:

if let dataSource = object as? UITableViewDataSource {
    // object conforms to UITableViewDataSource and is bound to dataSource
} else {
    // object not conform to UITableViewDataSource
}

 

注意,當做完匹配之后,dataSource 會轉換為 UITableViewDataSource 類型,所以你只能訪問和調用UITableViewDataSource 協議定義的屬性和方法。當你想進行其他操作時,必須將其轉換為其他的類型。

可以在 Protocols 查看更多相關信息。



注:相關教程知識閱讀請移步到swift教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲va欧美va国产综合剧情| 韩国国内大量揄拍精品视频| 日韩激情av在线播放| 亚洲少妇中文在线| 日韩大片在线观看视频| 欧美激情一区二区久久久| 久久九九免费视频| 国产精品男人爽免费视频1| 成人久久久久爱| 国产精品欧美久久久| 国产精品久久久久久久久| 国产亚洲欧洲高清| 欧美黑人性生活视频| 久久中国妇女中文字幕| 欧美精品免费播放| 日本国产一区二区三区| 欧美激情第1页| 精品久久久久久久久久久久久久| 欧美视频二区36p| 久久香蕉国产线看观看网| 中文字幕久热精品在线视频| 欧美俄罗斯乱妇| 91国产中文字幕| 亚洲免费一在线| 欧美疯狂性受xxxxx另类| 国产精品亚洲综合天堂夜夜| 欧美性在线观看| 91在线精品播放| 国产亚洲美女精品久久久| 国产精品久久不能| 色偷偷91综合久久噜噜| 欧美日韩人人澡狠狠躁视频| 欧美性少妇18aaaa视频| 久久电影一区二区| 日本精品视频在线| 九九精品视频在线观看| 成人羞羞国产免费| 国产成人精品视频| 亚洲丁香婷深爱综合| 日本欧美国产在线| 丝袜一区二区三区| 亚洲欧洲视频在线| 久久综合网hezyo| 精品国产一区二区三区久久久狼| 91香蕉嫩草神马影院在线观看| 亚洲最大的av网站| 成人性生交大片免费观看嘿嘿视频| 国模精品一区二区三区色天香| 亚洲免费视频观看| 国产精品美女av| 亚洲精品国产成人| 亚洲日韩中文字幕| 亚洲精品久久在线| 日韩电视剧免费观看网站| 97成人精品区在线播放| 日韩av一卡二卡| 国产丝袜高跟一区| 在线观看日韩www视频免费| 日韩免费在线视频| 色综久久综合桃花网| 九九视频这里只有精品| 日韩国产高清视频在线| 国产mv免费观看入口亚洲| 亚洲一区二区三区四区视频| 国产精品白嫩美女在线观看| 4k岛国日韩精品**专区| 亚洲二区在线播放视频| 色哟哟亚洲精品一区二区| 亚洲精品久久久久国产| 九九视频直播综合网| 欧美成人h版在线观看| 精品福利视频导航| 97国产suv精品一区二区62| 色99之美女主播在线视频| 欧美裸身视频免费观看| 福利视频一区二区| 国产成人精品优优av| 国产精品高潮呻吟视频| 欧美猛交ⅹxxx乱大交视频| 国产精品海角社区在线观看| 国产精品国产自产拍高清av水多| 精品无人国产偷自产在线| 日韩精品欧美激情| 欧美亚洲第一页| 久久久97精品| 欧美激情亚洲一区| 超碰97人人做人人爱少妇| 色老头一区二区三区在线观看| 亚洲精品黄网在线观看| 国产成人免费91av在线| 91九色蝌蚪国产| 国产成人福利网站| 精品久久久久久中文字幕一区奶水| 美女扒开尿口让男人操亚洲视频网站| 欧美日韩在线视频首页| 97久久精品视频| 亚洲女在线观看| 日韩精品在线免费观看视频| 欧美另类极品videosbest最新版本| 欧美一级淫片丝袜脚交| 91久热免费在线视频| 国产日韩欧美日韩大片| 在线观看欧美视频| 色婷婷成人综合| 国产精品福利在线观看| 97视频在线观看亚洲| 日韩一区二区三区在线播放| 欧美多人乱p欧美4p久久| 国产精品久久久久久久一区探花| 国产精品对白刺激| 亚洲欧美日韩中文视频| 欧美成人黄色小视频| 久久久久国产视频| 久久不射热爱视频精品| 欧美在线一级视频| 亚洲永久免费观看| 91精品国产综合久久久久久蜜臀| 国产精品高清在线| 国产成人综合一区二区三区| 久久影院资源站| 日韩一区二区久久久| 黄色成人在线播放| 国产精品久久久久久久久久99| 日韩精品免费电影| 成人性生交xxxxx网站| 亚洲女人天堂成人av在线| 国产精品视频白浆免费视频| 久久男人的天堂| 91精品国产九九九久久久亚洲| 91高清视频在线免费观看| 国产精品自产拍高潮在线观看| 日韩国产在线播放| 秋霞成人午夜鲁丝一区二区三区| 亚洲精品久久在线| 欧美大片免费观看在线观看网站推荐| 欧美激情视频网址| 国产精品久久久999| 日韩国产欧美精品一区二区三区| 欧美精品xxx| 亚洲欧美日韩天堂| 在线视频日韩精品| 美女少妇精品视频| 欧美亚洲一区在线| 中文字幕在线精品| 久久久黄色av| 亚洲最大的网站| 亚洲天堂av电影| 成人免费福利在线| 欧美午夜视频一区二区| 亚洲**2019国产| 欧美丝袜一区二区三区| 不卡毛片在线看| 91免费福利视频| 亚洲加勒比久久88色综合| 亚洲精品大尺度| 97不卡在线视频| 精品国产精品自拍| 国内精品久久久久影院 日本资源| 亚洲影院污污.| 午夜精品一区二区三区在线播放| 色哟哟入口国产精品| 日韩精品极品在线观看播放免费视频| 亚洲日本成人女熟在线观看| 国产精品网站视频|