2
クラスでは、クロージャパラメータを宣言するときにクラス自体を参照する方法はありますか? Foo
を構築するときになるように、以下の例では スイフトで自分のタイプを参照していますか?
Self
の代わりに、どのようなタイプを配置するために、閉鎖パラメータも
AnotherFoo
ため
Foo
と同様になりますか?
class FooBase {
init(completionHandler: (_ myself : Self)) {
// ...
self.completionHandler = completionHandler
}
var completionHandler : ((_ :Self) -> Void)?
func strategyMethod() { ... }
}
class Foo : FooBase {
// ...
override func strategyMethod() {
// do stuff
completionHandler?(self)
}
}
class AnotherFoo : FooBase {
// ...
override func strategyMethod() {
// do other stuff
completionHandler?(self)
}
}
func useFoos {
let foo = Foo(completionHandler: {(me : Foo) in
// ...
})
let anotherFoo = AnotherFoo(completionHandler: {(me : AnotherFoo) in
// ...
})
}
、私はあなたができるとは思わないので:あなたはパラメータがある知っている型にキャストタイプなどがありますが、初期化関数に渡す閉鎖中
使用FooBase、。うまくいけば、ここの真の達人はより良い答えを得ることができます。クラス階層に関しては、これは横向きですが、正しいのでしょうか?これはどの言語でもできますか? – dfd
関連(dupe?):[Self in init params](http://stackoverflow.com/q/40055862/2976878)。しかし、あなたの設定は安全ではありません。非最終クラスの '((Self) - > Void)型のストアドプロパティを持つことはできません。 'Foo'では'(Foo) - > Void'型の値を保持できます。しかし、あなたが 'FooBase'にアップキャストすれば、' FooBase(FooBase) - > Void'と静的に型付けされています。これは 'AnotherFoo'パラメタで呼び出すことができます - 違法です(' AnotherFoo'≠ 'Foo')。 – Hamish
*完全に正しいとする - 私はupvotedと綴り正しいそれを根絶した。謝罪。 – dfd