5

Swiftには、指定された初期化子の概念があります(これは、他の言語で知っている「通常の」コンストラクターだと思います)。
しかし、Convenience Initializer と呼ばれるものもあり、書き方は理解できますが、要点がわかりません。
というのは、私の理解が正しければ、キーワードを書かなくても同じことを達成できるconvenienceでしょうか?

4

2 に答える 2

1

私が理解しているように、これらの初期化子の唯一のポイントは利便性です。同じ引数を持つオブジェクトを何度も何度も作成する必要がある場合があります。その場合、はるかに少ないパラメーターを使用する別の init メソッドを追加するだけで、残りのパラメーターはハードコードされます。

たとえば、いくつかの Logger クラス

init(type: LoggerType, filepath: String, configurations: LoggerConfig, etc.)

このロガーを同じ引数で頻繁に使用する可能性があります。コードの重複を避けるために、いくつかのデフォルト値を持つ便利な初期化子を追加できます

convenience init(){ self.init(type: LoggerType.SomeType, filepath: "/log", configurations: LoggerConfig.Default) }

于 2015-08-20T18:14:30.160 に答える
0

実際、それらを理解するのは非常に簡単です。これらはデフォルトのパラメーターを持つイニシャライザーです。

ドキュメントから:

便利な初期化子は二次的なもので、クラスの初期化子をサポートします。便利な初期化子を定義して、指定された初期化子のパラメーターの一部をデフォルト値に設定して、便利な初期化子と同じクラスから指定された初期化子を呼び出すことができます。便利なイニシャライザを定義して、特定のユース ケースまたは入力値の型用にそのクラスのインスタンスを作成することもできます。

例:

class A {
    var a: Int
    var b : Int

    init() {
        a = 0
        b = 0
    }

    /*convenience*/ init(a: Int) {
        self.init()
        self.a = a
    }
}

上記の場合、 を呼び出すことはできませんself.init()。初期化子をキーワードでマークしていますconvenience。そうしないと、コンパイラ エラーが発生します。したがって、同じクラスから 2 つの指定された初期化子をチェーンすることはできません。

于 2015-08-20T18:12:18.500 に答える