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

首頁 > 編程 > Swift > 正文

在Swift中使用Cocoa的現(xiàn)有設(shè)計模式介紹

2020-03-09 17:52:20
字體:
供稿:網(wǎng)友
這篇文章主要介紹了在Swift中使用Cocoa的現(xiàn)有設(shè)計模式介紹,Cocoa是蘋果公司為Mac OS X所創(chuàng)建的原生面向?qū)ο蟮腁PI,是Mac OS X上五大API之一,需要的朋友可以參考下
 

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

委托(Delegation)

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

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

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

 

復(fù)制代碼代碼如下:

// @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 對象,并將初始值設(shè)為 nil。

延遲初始化(Lazy Initialization)

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

錯誤報告(Error Reporting)

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

復(fù)制代碼代碼如下:

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

 

當(dāng)你實現(xiàn)自己的方法時,你需要配置一個 NSErrorPointer 對象,并將 NSErrorPointer 對象的 memory 屬性設(shè)為你創(chuàng)建的NSError 對象。首先檢查調(diào)用者傳遞的參數(shù),確保它是一個非 nil 的 NSError 對象。
復(fù)制純文本新窗口

復(fù)制代碼代碼如下:

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)

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

類型匹配與統(tǒng)一規(guī)范(Introspection)

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

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

復(fù)制代碼代碼如下:

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

 

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

復(fù)制代碼代碼如下:

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 中查看更多信息。

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

復(fù)制代碼代碼如下:

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

 

注意,當(dāng)做完匹配之后,dataSource 會轉(zhuǎn)換為 UITableViewDataSource 類型,所以你只能訪問和調(diào)用UITableViewDataSource 協(xié)議定義的屬性和方法。當(dāng)你想進(jìn)行其他操作時,必須將其轉(zhuǎn)換為其他的類型。

可以在 Protocols 查看更多相關(guān)信息。



注:相關(guān)教程知識閱讀請移步到swift教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 999精品久久久 | 国产手机国产手机在线 | 午夜精品久久久久久久久久久久久蜜桃 | 久久久精品视频在线观看 | av成人在线电影 | 中国av中文字幕 | 成人一区二区在线观看视频 | 操操插插 | 水多视频在线观看 | 成人三级视频在线观看 | 日本xxxx视频 | 精品国产一区二区久久 | 538任你躁在线精品视频网站 | 色中色激情影院 | 久久久经典视频 | 日本欧美一区二区三区视频麻豆 | 一区二区三区欧美精品 | 欧美日韩视频第一页 | 日本a大片| 日韩激情一区 | 国产精品一区网站 | 日韩高清影视 | 亚洲码无人客一区二区三区 | 欧美成人免费看 | 特级黄一级播放 | 精品国产一区二区三区在线观看 | 国产中文一区 | 久久丝袜脚交足黄网站免费 | 九九精品在线播放 | 国产在线精品区 | 精精国产xxxx视频在线播放7 | 免费久久久久 | 久久精热 | 羞羞视频免费网站含羞草 | 性日本xxx| 欧美一级黄 | 一级电影免费在线观看 | 一级免费 | 九色新网址 | 亚洲国产精品一区 | 91精品国产综合久久久动漫日韩 |