LoginSignup
0
0

More than 3 years have passed since last update.

[iOS/Swift] アプリ開発の実務的アプローチで学ぶデザインパターン ~Adapter~

Last updated at Posted at 2020-01-13

この記事シリーズは、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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0