【发布时间】:2017-07-10 09:34:13
【问题描述】:
在类中,声明闭包参数时如何引用类本身?
在下面的例子中,用什么类型代替Self,这样在构造Foo时,闭包参数也变成Foo,AnotherFoo也是如此?
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
// ...
})
}
【问题讨论】:
-
被连根拔起,因为我认为你做不到。希望这里的真正大师能有更好的答案。就类层次结构而言,这是横向的,对吗?这可以用任何语言完成吗?
-
相关(欺骗?):Self in init params。但是无论如何你的配置是不安全的——你不可能在非最终类中拥有
((Self) -> Void)?类型的存储属性。在Foo中,它可以保存(Foo) -> Void类型的值。但是,如果您随后向上转换为FooBase,它现在静态类型为(FooBase) -> Void,这意味着您可以使用AnotherFoo参数调用它——这将是非法的(AnotherFoo≠Foo)。 -
要完全正确正确 - 我投了赞成票并且拼写正确使它被连根拔起。道歉。
-
此功能已记录在此accepted proposal 中,但尚未实现。
-
@Alexander 据我所知,该提案仅旨在将
Self引入类实例成员的主体,以及添加对值类型的支持——我不 相信它涵盖了使用Self作为方法的闭包参数(但我想我们将不得不等待,看看它的实现会带来什么)。