我正在尝试使用“ abc”过滤[String?]数组。
KeyedEntityMap
如何避免在闭合件内强行展开?我知道let和guard let语句是否存在,但不太确定如何在此处应用它们?
答案 0 :(得分:2)
您可以通过直接与true
进行比较来避免强制展开:
let tempFilteredResult = keysForAutoComplete.filter { $0?.contains("abc") == true }
或使用 nil合并运算符 ??
:
let tempFilteredResult = keysForAutoComplete.filter { $0?.contains("abc") ?? false }
说明:
$0?.contains("abc")
使用的是可选链接,结果为Bool?
,如果元素为nil
或{{1},则为nil
}或Optional(true)
,具体取决于Optional(false)
是否包含String
。您可以将"abc"
与Bool?
进行比较,因此仅当存在包含Bool
的{{1}}时,与true
进行比较才会返回true
。
如果 nil合并运算符不是String
,则取消包装该值;如果为"abc"
,则将其替换为提供的默认值。由于您希望nil
项返回nil
进行比较,因此安全展开的方法是使用nil
。
如果您希望结果为false
,则可以将?? false
与三元运算符 [String]
一起使用,以生成{{ 1}}:
compactMap
说明:
此处,?:
用于返回包含[String]
或let tempFilteredResult = keysForAutoComplete.compactMap { $0?.contains("abc") == true ? $0 : nil }
(如果不包含)的原始值。 ?:
然后消除"abc"
的值并解开nil
以返回compactMap
。
答案 1 :(得分:0)
您可以使用compactMap
运算符删除nil
值并将数组保留为[String]
类型,因此每个元素都是非可选值。之后,您可以在新数组上使用filter
。这样,您不必担心nil值,那么就不需要解包。
let keysForAutoComplete = ["abc", "ab", nil, "bca", "abcd"]
let tempFilteredResult = keysForAutoComplete.compactMap{$0}.filter{$0.contains("abc")}