21

Swift でカスタム初期化子を作成しようとしています。私はこのようなものを持っています:

convenience init(datasource:SomeProtocol) {
    assert(datasource != nil, "Invalid datasource")
    if(datasource == nil) {
        return nil
    }
    self.init()
}

「return nil」行で、「指定された引数を受け入れる '__conversion' のオーバーロードが見つかりませんでした」というエラーが表示されます。

したがって、私が達成しようとしているのは、呼び出し元が有効なデータソースを提供しない場合、この便利な初期化子が nil を返すようにすることだけです。

ここで何が間違っていますか?

ありがとう

4

4 に答える 4

49

更新: Xcode 6.1 ベータ 1 (Mac Dev Center で入手可能)以降、Swift イニシャライザはオプションを返すように宣言できます。

convenience init?(datasource:SomeProtocol) {
    if datasource == nil {
        return nil
    }
    self.init()
}

または暗黙的にアンラップされたオプション:

convenience init!(datasource:SomeProtocol) {
    if datasource == nil {
        return nil
    }
    self.init()
}
于 2014-09-15T02:41:37.873 に答える
2

initializers実際には戻り値がないためです。メソッドが戻り値の型を想定していない場合、返すことはできませんnil

やろうとしていることを達成する (つまり、クラスにデータソースを強制する) には、データソースをオプションではなくします。オプションではない変数には値が必要であり(nil にすることはできません)、初期化する必要があります。

于 2014-06-12T17:01:20.193 に答える