如果我们有可选值foo
和bar
,Swift将允许我们编写:
foo?.doSomething(bar)
这将计算为nil
,如果foo
是nil
。但这不会让我们写:
foo?.doSomething(bar?)
也就是说,可选链接仅适用于函数调用外部的参数,而不适用于参数列表内部。(此限制的原因尚不清楚,但我们在这里。)
假设我想编写一个apply
函数,让我将事情转移到可选链接的管辖范围内,如下所示:
bar?.apply { foo?.doSomething($0) }
这里apply
是一个通用函数,它接受一个参数(在这种情况下为bar
),然后执行闭包。因此,如果foo
或bar
为零,则表达式将为nil
。
这是我尝试过的:
public protocol HasApply {}
extension HasApply {
public func apply<T>(_ f : (Self) -> T) -> T {
f(self)
}
}
就目前而言还可以。但是要使其工作,我仍然必须将协议明确地应用于我关心的类型:
extension Int : HasApply {}
好的,可以使用Int
。但是我不想为每种类型复制和粘贴。所以我尝试这样:
extension AnyObject : HasApply {}
不,那行不通:错误是Non-nominal type 'AnyObject' cannot be extended
。
因此,问题就来了:没有办法使这个泛型函数作为协议方法起作用吗?
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句