デザインパターン
■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)
}