web-dev-qa-db-ja.com

Swiftクラスの初期化子を自動的に作成する方法は?

PDATE:クラスではなく構造体を使用します。 Structは多くの点で優れており、独自のイニシャライザを持っています。

これは私のモデルクラスです。 initメソッドを自動的に作成することは可能ですか?すべての変数を1つずつ初期化する必要があり、多くの時間がかかります。

class Profile {

    var id: String
    var name: String
    var image: String

    init(id: String, name: String, image: String) {
        self.id = id
        self.name = name
        self.image = image
    }
}

が欲しいです self.id = idおよびその他の変数を自動的に初期化します。

18
Bhavuk Jain

UpdateXcode 11.4以降

refactor(マウスの右クリックメニュー)を使用して、クラスと構造体memeberwise initializerを生成できます。

注:struct自動初期化子は内部にあります。モジュールを作成してpublicにするときに、memeberwise initializerを何を生成するかを指定できます。

右クリック>「リファクタリング」>「メンバーごとの初期化を生成」

xcode generate memberwise initialization

古いXcodeの場合

Xcode用の便利なプラグインがあります: https://github.com/rjoudrey/Swift-init-generator または https://github.com/Bouke/SwiftInitializerGenerator

プラグイン作成者に感謝します。

25
Moris Kramer

これは、次のツールで実行できます。

Xcode Version 10.1 (10B61)
Toolchain: Swift Development Snapshot 2018-12-25 (a) // Not sure if the toolchain matters.

次のクラスが与えられた場合(または一時的にキーワードstructclassに変更し、リファクタリング後にstructに戻す場合の構造体):

class MyClass {
    let myIntProperty: Int
    let myStringProperty: String
    let myOptionalStringProperty: String?
    let myForcedUnwrappedOptionalStringProperty: String!
}

Xcodeに移動して:

  1. クラス名をダブルクリックします
  2. 右クリック
  3. リファクタリング
  4. メンバーごとの初期化子を生成する

上記の手順は次のようになります。

enter image description here

ほんの少し後、Xcodeはこの初​​期化子を生成します。

internal init(myIntProperty: Int, myStringProperty: String, myOptionalStringProperty: String?, myForcedUnwrappedOptionalStringProperty: String?) {
    self.myIntProperty = myIntProperty
    self.myStringProperty = myStringProperty
    self.myOptionalStringProperty = myOptionalStringProperty
    self.myForcedUnwrappedOptionalStringProperty = myForcedUnwrappedOptionalStringProperty
}
27
J. Doe

いいえ、クラスにはそのような機能はありません。ただし、これをstructとして設計すると、メンバーごとの初期化子が無料で得られます—他の初期化子を自分で定義しない場合。

例えば:

struct Point {
    var x: Float
    var y: Float
}
...
var p = Point(x: 1, y: 2)

The Swift Programming Languageの本から:

独自のカスタム初期化子を定義していない場合、構造体型はメンバーワイズ初期化子を自動的に受け取ります。デフォルトの初期化子とは異なり、デフォルト値を持たないプロパティが格納されている場合でも、メンバーワイズの初期化子を受け取ります。

メンバーごとの初期化子は、新しい構造体インスタンスのメンバープロパティを初期化する簡単な方法です。新しいインスタンスのプロパティの初期値は、メンバーごとの初期化子に名前で渡すことができます。

10
Paulo Mattos

XCodeの新しいバージョン;

まず、クラス「yourclassname {」を含む行をクリックしてから、右クリックして「コードアクションの表示」を選択します。次に、[Generate Memberwise Initializer]をクリックします。以上です。

1-> まず、クラス「yourclassname {」を含むクリック行

2-> 右クリックして[コードアクションの表示]を選択します。

0
wilddev