如何扩展所有类型的可选链接

马修·巴特里克

如果我们有可选值foobar,Swift将允许我们编写:

foo?.doSomething(bar)

这将计算为nil,如果foonil但这不会让我们写:

foo?.doSomething(bar?)

也就是说,可选链接仅适用于函数调用外部的参数,而不适用于参数列表内部。(此限制的原因尚不清楚,但我们在这里。)

假设我想编写一个apply函数,让我将事情转移到可选链接的管辖范围内,如下所示:

bar?.apply { foo?.doSomething($0) }

这里apply是一个通用函数,它接受一个参数(在这种情况下为bar),然后执行闭包。因此,如果foobar为零,则表达式将为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

因此,问题就来了:没有办法使这个泛型函数作为协议方法起作用吗?

清扫器

没有办法使该泛型功能作为协议方法起作用?

不,您必须“将协议明确地应用于我关心的类型”。

但是,实际上您是在重新发明轮子。这是flatMap/的用例map如果foobar都是可选的,则可以编写:

bar.flatMap { foo?.doSomething($0) }

注意缺少?after bar要调用flatMapOptional,而不是bar“S型。如果doSomething返回T,则上面的表达式将返回T?

如果仅bar是可选的,请使用map

bar.map { foo.doSomething($0) }

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何创建具有现有类型的所有属性但可选的新Flow类型

如何在流中定义具有指定类型的所有字段可选的泛型类型

如何为所有整数类型创建扩展方法?

如何在xml模式中引用所有扩展类型?

所有类型的Chrome扩展程序脚本如何工作?

任何类型的可选扩展

Typescript:如何声明一个包含所有扩展通用类型的类型的类型?

获取chrome扩展中的所有链接

如何使用可选类型定义自引用可扩展接口?

TypeScript - 如何链接访问可选的嵌套类型属性?

我如何接受HTML中危险的文件扩展名以外的所有文件类型

如何在TextView中建立所有3种类型的链接

如何使用Shell脚本从特定目录创建指向具有特定扩展名的所有文件的符号链接?

Chrome书签可扩展所有页面链接

如何在PHP中捕获带有可选空格的链接?

扩展所有 Iterators<Item = Result<Type, E>> 以转换类型

在Swift中扩展所有数字类型

vim查找与文件类型关联的所有扩展名

查找HTMLHelper,URLHelper和AJAXHelper类型的所有扩展方法

如何捕获所有组,包括可选的URL组?

如何清除视图中所有可选元素的焦点?

如何合并两个接口并使所有字段可选?

如何编写类型定义为具有可选参数的功能?

如何为具有可选属性的类型分配值?

如何给具有道具的函数类型赋予可选属性?

如何下载链接中的所有文件

如何找到目录的所有链接

如何从DOM获取所有链接?

如何获得所有链接的表单页面?