DesignPatterns
Swift

Swiftでデザインパターンを学習 ~Prototype~

定義

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