作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试使用“abc”过滤 [String?] 数组。
// keysForAutoComplete: [String?]
let tempFilteredResult = keysForAutoComplete.filter { ($0?.contains("abc"))! }
如何避免在闭包中强制展开?我知道 if let 和 guard let 语句,但不太确定如何在此处应用它们?
最佳答案
您可以通过直接与 true
进行比较来避免强制展开:
let tempFilteredResult = keysForAutoComplete.filter { $0?.contains("abc") == true }
或者使用nil 合并运算符 ??
来解包结果:
let tempFilteredResult = keysForAutoComplete.filter { $0?.contains("abc") ?? false }
或者使用nil 合并运算符 ??
来解包输入:
let tempFilteredResult = keysForAutoComplete.filter { ($0 ?? "").contains("abc") }
解释:
$0?.contains("abc")
正在使用可选链接,结果是 Bool?
,即 nil
如果元素是 nil
或 Optional(true)
或 Optional(false)
取决于 String
包含 "abc"
。您可以将 Bool?
与 Bool
进行比较,因此与 true
进行比较将仅在存在时返回 true
String
包含 "abc"
。
如果值不是nil
,nil 合并运算符 将解包该值,如果它是nil
,则将其替换为提供的默认值。由于您希望 nil
项目返回 false
进行比较,安全解包的方法是使用 ??假的
。
在第三个示例中,nil 合并运算符 将 tempFilteredResult
中的值解包并替换为空字符串 ""
如果它是 无
。
如果您希望结果是[String]
,您可以使用compactMap
和三元运算符 ? :
生成一个 [String]
数组:
let tempFilteredResult = keysForAutoComplete.compactMap { $0?.contains("abc") == true ? $0 : nil }
解释:
这里,?:
如果包含"abc"
则返回原值,如果不包含则返回nil
。 compactMap
然后消除 nil
值并打开 String?
以返回 [String]
。
关于swift - 避免在 Swift 4 中用力展开过滤器闭包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52018438/
我是一名优秀的程序员,十分优秀!