定義
Prototypeとは
Prototype パターンは、生成すべきオブジェクトの種類を原型となるインスタンスを使って明確にし、それをコピーすることで新たなオブジェクトの生成を行うパターンです。
https://dev.classmethod.jp/smartphone/ios8-swift-design-pattern-prototype/
実装してみた
prototype.swift
import UIKit
protocol Clonable {
associatedtype Prototype
func clone() -> Prototype
}
class Person: Clonable{
typealias Prototype = Person
var name: String
var age: Int
init(name: String, age: Int) {
self.name = name
self.age = age
}
func clone() -> Person {
return Person(name: self.name, age: self.age)
}
}
output.swift
var person = Person(name: "John", age: 33)
var clone = person.clone()
person.name //John
person.age // 33
clone.name // John
clone.age //33
// ===演算子は、インスタンスの実体が同一のものであるかどうかを調べるためのもの
person === clone //false
NSCopyingってなかったっけ?
copy.swift
import UIKit
class Person: NSCopying {
var name: String
var age: Int
init(name: String, age: Int) {
self.name = name
self.age = age
}
func copy(with zone: NSZone? = nil) -> Any {
return Person(name: self.name, age: self.age)
}
}
output.swift
var person = Person(name: "John", age: 33)
var copy = person.copy()
// copyがAny型なので、ドットアクセスできない。
// copy.name
// copy.age
// Any型からPerson型へキャストする必要がある。
if let personCopy = copy as? Person {
personCopy.name // John
personCopy.age //33
person === personCopy // false
}
思ったこと
Swiftでコピーを作りたいときは、プロトタイプを使った方が型情報を決められてNSCopyingよりも良いのでは?と思った。
勉強法
- OSSをみて、Swiftでのデザインパターンの表現を理解する。
- 毎日30分
サンプルコード
GitHubに置いてます。
https://github.com/syatyo/swift-design-pattern-sample/blob/master/Prototype.playground/Contents.swift