この記事シリーズは、iOS/Swiftエンジニアである執筆者個人が、
ごく普通のiOSアプリ開発でよくある状況や
Swiftのコアライブラリやフレームワークで使われているパターンに
着目してデザインパターンを学び直してみた記録です。
関連記事一覧
[iOS/Swift] アプリ開発の実務的アプローチで学ぶデザインパターン
Adapterパターン概要
- 既存クラスのインターフェイスをそのまま使わずに一皮被せて利用する手法です。
- 既存クラスのインタフェースを使いやすく変更したりする場合に使います。
- 継承を利用した手法と委譲を利用した手法があります。
- Swiftはプロトコル指向と言われますし、また継承できないケースもあると思いますので、委譲パターンを使うケースが多いと思われます。
- Wrapperパターンと呼ばれることもあります。
- GoFのでデザインパターンでは構造に関するパターンに分類されます。
使い所
- 例えば、OSSライブラリや他社製SDKなどに関して、
- アプリに使いやすい形式に変換することで負担を少なく/誤解なく使えるようにしたい、とか、
- インターフェイス変更がアプリに与える影響を最小化したい、など
サンプルコード(委譲パターン)
Swiftバージョンは 5.1 です。
struct OldDeathStarSuperlaserTarget {
let angleHorizontal: Float
let angleVertical: Float
init(angleHorizontal: Float, angleVertical: Float) {
self.angleHorizontal = angleHorizontal
self.angleVertical = angleVertical
}
}
protocol NewDeathStarSuperLaserAiming {
var angleH: Double { get }
var angleV: Double { get }
}
struct NewDeathStarSuperlaserTarget: NewDeathStarSuperLaserAiming {
private let target: OldDeathStarSuperlaserTarget
var angleH: Double {
return Double(target.angleHorizontal)
}
var angleV: Double {
return Double(target.angleVertical)
}
init(angleH: Double, angleV: Double) {
self.target = OldDeathStarSuperlaserTarget(angleHorizontal: Float(angleH),
angleVertical: Float(angleV))
}
}
let newFormat = NewDeathStarSuperlaserTarget(angleH: 14.0, angleV: 12.0)
newFormat.angleH
newFormat.angleV
引用元:
https://github.com/ochococo/Design-Patterns-In-Swift#-adapter