你好,歡迎來到IOS教程網

 Ios教程網 >> IOS使用技巧 >> IOS7技巧 >> ios開發之SWIFT中delegate工作筆記

ios開發之SWIFT中delegate工作筆記

編輯:IOS7技巧
學過.net的朋友肯定知道delegate了,但如果我們想在swift中使用delegate如何來做呢,下面來看一篇關於delegate工作筆記。

delegate

Cocoa 開發中接口-委托 (protocol-delegate) 模式是一種常用的設計模式,它貫穿於整個 Cocoa 框架中,為代碼之間的關系清理和解耦合做出了不可磨滅的貢獻。

在 ARC 中,對於一般的 delegate,我們會在聲明中將其指定為 weak,在這個 delegate 實際的對象被釋放的時候,會被重置回 nil。這可以保證即使 delegate 已經不存在時,我們也不會由於訪問到已被回收的內存而導致崩潰。ARC 的這個特性杜絕了 Cocoa 開發中一種非常常見的崩潰錯誤,說是救萬千程序員於水火之中也毫不為過。

在 Swift 中我們當然也會希望這麼做。但是當我們嘗試書寫這樣的代碼的時候,編譯器不會讓我們通過:

 代碼如下 復制代碼

protocol MyClassDelegate {
    func method()
}

class MyClass {
    weak var delegate: MyClassDelegate?
}

class ViewController: UIViewController, MyClassDelegate {
    // ...
    var someInstance: MyClass!

    override func viewDidLoad() {
        super.viewDidLoad()

        someInstance = MyClass()
        someInstance.delegate = self
    }

    func method() {
        print("Do something")
    }

    //...
}

// weak var delegate: MyClassDelegate? 編譯錯誤
// 'weak' cannot be applied to non-class type 'MyClassDelegate'
這是因為 Swift 的 protocol 是可以被除了 class 以外的其他類型遵守的,而對於像 struct 或是 enum 這樣的類型,本身就不通過引用計數來管理內存,所以也不可能用 weak 這樣的 ARC 的概念來進行修飾。

想要在 Swift 中使用 weak delegate,我們就需要將 protocol 限制在 class 內。一種做法是將 protocol 聲明為 Objective-C 的,這可以通過在 protocol 前面加上 @objc 關鍵字來達到,Objective-C 的 protocol 都只有類能實現,因此使用 weak 來修飾就合理了:

 代碼如下 復制代碼

@objc protocol MyClassDelegate {
    func method()
}

另一種可能更好的辦法是在 protocol 聲明的名字後面加上 class,這可以為編譯器顯式地指明這個 protocol 只能由 class 來實現。

 代碼如下 復制代碼

protocol MyClassDelegate: class {
    func method()
}

相比起添加 @objc,後一種方法更能表現出問題的實質,同時也避免了過多的不必要的 Objective-C 兼容,可以說是一種更好的解決方式。

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved