デザインパターン - ntuf/Tips GitHub Wiki

■delegateで実装する (これもデザインパターン)
  protocolでメソッドを宣言しておく  継承して、
protocol ButtonDelegate {
 func audio()
 func background()
}

class Button {
 var delegate: ButtonDelegate? = nil //デリゲートを保持
 func click() {
   if let dg = self.delegate {
    dg.audio()
    dg.background()
  } }}

class Button1: ButtonDelegate {
  func audio() {
   print(“音1を鳴らします”)
  }
  func background() {
   print(“背景1を表示します”)
  }
}

let button = Button()
let button1 = Button1()
button.delegate = button1
button.click()

■Closure Callbackパターン (いわゆるクロージャ)class View {
    var model: Model = Model()
    func receiveUIEvent() {
        // 完了後の処理をクロージャーで指定する
        // 末尾のクロージャーの引数名は省略できる(trailing closure記法)
        model.updateData { data in
            print(data)
        }
    }
}

class Model {
    var data: Int = 0

    // 完了後の処理を引数のクロージャーで受け取って実行する
    func updateData(completion: (_ data: Int) → Void) {
        data += 1
        completion(data)
    }
}

ーーーーーーーーーーーークラス図A ◇→ B   (AがBをメンバとして持つ)A …▷ B   (AがBを継承する)A creates→ B (AがBをnewする)ーーーーーーーーーーーー■デザインパターン
・Iteratorパターン
Aggregate (Aggregate:「集計」という意味) iteratorConcreteAggregate(例:BookShelf) iterator
Iterator  (Iterator:直訳で「繰り返すもの」) hasNext / nextConcreteIterator(例:BookShelfIterator) hasNext / next  ConcreteAggregateをメンバとして持つ()Item(例:Book) name …(メンバはなんでも良い)
数え上げる方式をまとめたもの hasNext next
swiftに抽象クラスはないのでprotocolを使って代理する
protocol Aggregate {
    func iterator() 
}

protocol Iterator {
    func next() → AnyObject {}
    func hasNext() → Bool {}
}

class ConcreteAggregate: Aggregate {
    private var items = [Item]()            
    override func iterator() → Iterator {  
        return ConcreteIterator(aggregate: self)
    }
    func addItem(item: Item) {              
        items.append(item)
    }
    func countOfItems() → Int {            
        return items.count
    }
    func itemAtIndex(index: Int) → Item {  
        return items[index]
    }
}

var ca = BookShelf()
ca.addItem(Book(name: “name 1”))
ca.addItem(Book(name: “name 2”))
ca.addItem(Book(name: “name 3”))
 
let it = ca.iterator()
 
while it.hasNext() {
    let item = it.next() as Item
    println(item.name)
}

⚠️ **GitHub.com Fallback** ⚠️