gpt4 book ai didi

swift - 避免在 Swift 4 中用力展开过滤器闭包

转载 作者:搜寻专家 更新时间:2023-10-31 22:54:22 26 4
gpt4 key购买 nike

我正在尝试使用“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 如果元素是 nilOptional(true)Optional(false) 取决于 String 包含 "abc"。您可以将 Bool?Bool 进行比较,因此与 true 进行比较将仅在存在时返回 true String 包含 "abc"

如果值不是nilnil 合并运算符 将解包该值,如果它是nil,则将其替换为提供的默认值。由于您希望 nil 项目返回 false 进行比较,安全解包的方法是使用 ??假的

在第三个示例中,nil 合并运算符tempFilteredResult 中的值解包并替换为空字符串 "" 如果它是


如果您希望结果是[String],您可以使用compactMap三元运算符 ? : 生成一个 [String] 数组:

let tempFilteredResult = keysForAutoComplete.compactMap { $0?.contains("abc") == true ? $0 : nil }

解释:

这里,?:如果包含"abc"则返回原值,如果不包含则返回nilcompactMap 然后消除 nil 值并打开 String? 以返回 [String]

关于swift - 避免在 Swift 4 中用力展开过滤器闭包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52018438/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com