ios - 为什么 Swift Array contains(_:) 方法必须是非可选的时才接受 nil 参数?
问题描述
我尽可能地简化了我的代码,使它仍然是一个可重现的例子。我认为,当我contains
在一系列调用中这样使用它时,它会编译、工作和contains
接受nil
它不应该的时候。
let array = [1, 2, 3, 4, 5].filter { _ in
[1, 2, 3].map { smallNumber in
"\(smallNumber)"
}
.contains(nil)
}
但是当我将map
结果分配给一个变量然后contains
用nil
值调用时,代码甚至都无法编译。
let array = [1, 2, 3, 4, 5].filter { _ in
let mappedNumbers = [1, 2, 3].map { smallNumber in
"\(smallNumber)"
}
return mappedNumbers.contains(nil)
}
Xcode 在抱怨'nil' is not compatible with expected argument type 'String'
,没错。
我希望在第一个示例中出现相同的错误。
解决方案
如果上下文需要,编译器可以自动将值包装到可选项中。这就是使简单的任务像
let value: Int? = 123
可能的。在您的第一个示例中,闭包的返回类型是String?
从上下文中推断出来的,因此map
返回[String?]
, 和.contains(nil)
可以应用于它。即编译器将代码理解为
let array = [1, 2, 3, 4, 5].filter { _ in
[1, 2, 3].map { smallNumber -> String? in
"\(smallNumber)"
}
.contains(nil)
}
在第二个示例中,编译器没有该上下文,并且mappedNumbers
类型为[String]
。您可以通过显式指定闭包返回类型来使其编译String?
:
let array = [1, 2, 3, 4, 5].filter { _ in
let mappedNumbers = [1, 2, 3].map { smallNumber -> String? in
"\(smallNumber)"
}
return mappedNumbers.contains(nil)
}
推荐阅读
- javascript - 在 class="A" 的元素中获取 class="B" 的 DOM 元素
- apache - 基于每个路径的 Apache 2.4 超时
- python - 使用多处理池预处理数据
- python - mac上的虚拟环境问题
- linux - 在网络服务器上设置 linux 机器
- go - 查询数据库时如何将雪花数组转换为Golang中的数组
- elasticsearch - 热门搜索的弹性搜索过滤器
- java - 这个 DFS 递归函数中的 depth + 1 和 depth++ 有什么区别?
- java - 我可以使用 BIRT 报表设计器中的信任库和密钥库使用 SSL 证书连接到数据库吗?
- python - Flask 应用程序未在开发配置上运行