文字っぽいの。

文字を書いています。写真も混ざります。

Swiftで大量のメンバ変数があるclassやstructのinitを自動生成する。

環境

課題

開発をしていると、こんな感じでメンバ変数がたっぷりあるclassができます。この例ではclassですが、structも同様ですね。

class SampleClass: Codable {
    public let id: Int
    public let title: String
    public let body: String
    public let thumbnailUrl: URL
    public let tags: [String]
    public let categories: [String]
    public let createdAt: Date
    public let updatedAt: Date
    public let comment: [String]
    public let isFavorited: Bool
    public let isBookmarked: Bool
    public let url: URL
}

Swiftのstructではinitが自動生成されますが、Embedded Frameworkを活用してModelをアプリ外に出しているとその恩恵を受けることができません。Modelを外に出している場合は、Codableに準拠しておくだけで済むことが多いのですが、たまにinitが必要になります。

さて、このメンバ変数に対応したinitを書くと、

init(id: Int, title: String, body: String, thumbnailUrl: URL, tags: [String], categories: [String], createdAt: Date, updatedAt: Date, comment: [String], isFavorited: Bool, isBookmarked: Bool, url: URL) {
    self.id = id
    self.title = title
    self.body = body
    self.thumbnailUrl = thumbnailUrl
    self.tags = tags
    self.categories = categories
    self.createdAt = createdAt
    self.updatedAt = updatedAt
    self.comment = comment
    self.isFavorited = isFavorited
    self.isBookmarked = isBookmarked
    self.url = url
}

と、結構な量を書く必要があり面倒です。実際のプロダクトコードでは、もっと多くのメンバ変数を持つ場合もあります。

解決法

XcodeのRefactor機能を使って自動生成します。

  1. class名 or struct名を右クリックする
  2. "Refactor"メニューを選ぶ
  3. "Generate Memberwise Initializer"をクリック

f:id:FromAtom:20210106000215g:plain

これで簡単にinitが生成できます。めでたしめでたし。