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

來源:互聯網
上載者:User

使用 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 查看更多相關資訊。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.