Swift中的設計模式

  1. 委託模式

    經過多年的Objective-C和Cocoa代碼編寫我想大部分人都對使用委託模式養成了一種嗜好。注意了!我們還是可以繼續保留這種嗜好的,下面是一個非常簡單的例子:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    @objc protocol DataReaderDelegate{
        @optional func DataWillRead()
        func DataDidRead()
    }
      
    class DataReader: NSObject {
         
        var delegate:DataReaderDelegate?
        var data:NSData?
      
        func buildData(){
              
            delegate?.DataWillRead?() // Optional method check
            data = _createData()
            delegate?.DataDidRead()       // Required method check
        }
    }

    這裏我們使用了一個簡單的@optional來替換了使用respondToSelector檢測委託方法是否存在。

    1
    delegate?.DataWillRead?()

    請注意我們在協議之前必須加@obj前綴,因爲後面使用了@optional。同時編譯器也會在這裏報一個警告的消息以防你沒有加上@obj。

    要實現協議的話,我們需要構建一個類來實現它然後用曾經在OC上用過的方式來指派。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class ViewController: UIViewController, DataReaderDelegate {
                                  
        override func viewDidLoad() {
            super.viewDidLoad()
              
            let reader = DataReader()
            reader.delegate = self
        }
      
        func DataWillRead() {...}
          
        func DataDidRead() {...}
    }

  2. 目標-動作模式

    另一常用的設計模式:目標-動作模式。我們仍然同樣可以像在OC中使用它那樣在Swift中實現它。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class ViewController: UIViewController {
          
        @IBOutlet var button:UIButton
          
        override func viewDidLoad() {
            super.viewDidLoad()
              
            button.addTarget(self, action: "buttonPressed:", forControlEvents: UIControlEvents.TouchUpInside)
        }
      
        func buttonPressed(sender:UIButton){...}
    }

    這裏唯一不同的地方就是如何定義一個selector選擇器。我們可以變形使用像下面這樣的字符串來寫方法原型:

    1
    Selector("buttonPressed:")

  3. 單例模式

    簡直又愛又恨。單件模式依舊是設計模式中最爲常用的模式之一。

    我們可以用GCD和dispatch_once來實現它,當然還可以用let關鍵字來實現線程安全。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class DataReader: NSObject {
          
        class var sharedReader:DataReader {
              
            struct Static{
                static let _instance = DataReader()
            }
              
            return Static._instance
        }
    ...
    }

    我們來快速瀏覽一下這段代碼:

    1.sharedReader是一個靜態的複合屬性(我們也可以替換爲方法)。

    2.靜態屬性不允許在類被實現的時候重構,所以由於內部類型是被允許的,我們可以再這裏加入一個結構體。

    3._instance是一個常量,它不會被重寫而且保證線程安全。

    可以參考下面DataReader單例的用法:

    1
    DataReader.sharedReader

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章