gpt4 book ai didi

swift - 在 Swift 中混合 for-in 和 if-let

转载 作者:搜寻专家 更新时间:2023-11-01 05:54:24 25 4
gpt4 key购买 nike

我可以在一条语句中合并 for-in 和 if-let 吗?

    for item in array {
if let f = item as? NSDictionary {
result.addObject(newFile(f))
}
}

array 是由 JSON 组成的,所以我不知道每个项目是否是 NSDictionary 。我必须检查一下。

我一直在寻找这样的东西:

for item as? NSDictionary in array {
// code
}

像 Python 或 Ruby。

最佳答案

@nickfalk 走在正确的轨道上,但我们可以做得更好。不幸的是,他的结果返回了 [AnyObject],然后您不能用它调用 newFile(我假设)。不过没关系,我们可以很容易地完成剩下的路。

你想要的是部分 map 。也就是说,您想将一个列表的一些(但可能不是全部)元素映射到另一个列表(从 AnyObjectFile,如果可以的话)。所以必须有一些选择规则,以及一些映射规则。可选的让我们结合这些。让我们调用执行此操作的函数 f。那么它的类型是:

f: T->U?

所以有一些魔法函数可能会将 T 转换为 U。我们想与之对应。听起来很简单:

extension Array {
func partialMap<U>(f: T->U?) -> [U] {
var result = [U]()
for x in self {
if let u = f(x) {
result.append(u)
}
}
return result
}
}

所以现在我们已经隐藏了所有讨厌的突变和 var 以及其他我们不必查看的深处。我们有一个函数,它采用从“某物”到“可能是其他东西”的映射函数,并返回“我们可以映射的其他东西”的列表。

现在一切都很好,不可变且可重用:

let result = array.partialMap { ($0 as? NSDictionary).map(newFile) }

哇哦。中间那个 map 是什么?那么,as? 返回 NSDictionary?。当您 map 一个可选值时,如果可选值是 None,它返回 None,否则它将函数应用于该值并将其包装在一些。所以这整个事情采用 AnyObject 并返回 File? 就像我们想要的那样。一个 partialMap 之后我们就有了答案。

关于swift - 在 Swift 中混合 for-in 和 if-let,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26560321/

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