gpt4 book ai didi

swift - Swift 中的列表理解

转载 作者:IT王子 更新时间:2023-10-29 05:00:45 25 4
gpt4 key购买 nike

语言指南没有显示任何列表理解的痕迹。 在 Swift 中完成此任务的最巧妙方法是什么?我正在寻找类似于以下内容的内容:

evens = [ x for x in range(10) if x % 2 == 0]

最佳答案

从 Swift 2.x 开始,有一些简短的等同于您的 Python 风格的列表理解。

Python 公式最直接的改编(读起来像“将转换应用到受过滤器影响的序列”)涉及链接可用的 mapfilter 方法到所有 SequenceType,并从 Range 开始:

// Python: [ x for x in range(10) if x % 2 == 0 ]
let evens = (0..<10).filter { $0 % 2 == 0 }

// Another example, since the first with 'x for x' doesn't
// use the full ability of a list comprehension:
// Python: [ x*x for x in range(10) if x % 2 == 0 ]
let evenSquared = (0..<10).filter({ $0 % 2 == 0 }).map({ $0 * $0 })

请注意,Range 是抽象的 — 它实际上并没有创建您要求的整个值列表,只是一个根据需要懒惰地提供它们的构造。 (从这个意义上说,它更像是 Python 的 xrange。)但是,filter 调用返回一个 Array,因此您失去了那里的“惰性”方面.如果你想让集合一直保持惰性,就这么说:

// Python: [ x for x in range(10) if x % 2 == 0 ]
let evens = (0..<10).lazy.filter { $0 % 2 == 0 }
// Python: [ x*x for x in range(10) if x % 2 == 0 ]
let evenSquared = (0..<10).lazy.filter({ $0 % 2 == 0 }).map({ $0 * $0 })

与 Python 中的列表理解语法(以及其他一些语言中的类似结构)不同,Swift 中的这些操作遵循与其他操作相同的语法。也就是说,构造、过滤和操作一系列数字的语法风格与过滤和操作对象数组的语法风格相同——您不必为一种工作使用函数/方法语法并列出另一个的理解语法。

并且您可以将其他函数传递给 filtermap 调用,并链接其他方便的转换,例如 sort减少:

// func isAwesome(person: Person) -> Bool
// let people: [Person]
let names = people.filter(isAwesome).sort(<).map({ $0.name })

let sum = (0..<10).reduce(0, combine: +)

不过,根据您的目的,可能有更简洁的方式来表达您的意思。例如,如果您特别想要一个偶数列表,您可以使用 stride:

let evenStride = 0.stride(to: 10, by: 2) // or stride(through:by:), to include 10

与范围一样,这为您提供了一个生成器,因此您需要从中创建一个Array 或遍历它以查看所有值:

let evensArray = Array(evenStride) // [0, 2, 4, 6, 8]

编辑:针对 Swift 2.x 进行了大量修改。如果你想要 Swift 1.x,请查看编辑历史。

关于swift - Swift 中的列表理解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24003584/

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