避免在Swift 4的过滤器封闭内部强制展开

时间:2018-08-25 14:54:08

标签: swift

我正在尝试使用“ abc”过滤[String?]数组。

KeyedEntityMap

如何避免在闭合件内强行展开?我知道let和guard let语句是否存在,但不太确定如何在此处应用它们?

2 个答案:

答案 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")}