改写为0,...,N的地图环

问题描述 投票:0回答:3

我有一个快速的代码如下图所示

var items: [Item] = []
for i in 0...20 {
    items.append( makeItem(atIndex: i) )
}

将有可能改写上述像

var items: [Item] = [0...20].map {
   makeItem(atIndex: i)
}
swift loops enumeration
3个回答
3
投票

这是可能的,只是不裹在一个数组的范围内,所以改用(0...20)[0...20]

你甚至可以通过函数的名字,你就不必创建一个单一的呼叫关闭。

let items = (0...20).map(makeItem)

1
投票

语法[0...20]是包含Int的单一封闭的范围内的数组,而不是一个int数组(这是什么,你通常要调用map()上),让你真正想要的是:

let integers = [
    0, 1, 2, 3, 4, 5, 
    6, 7, 8, 9, 10, 11, 
    12, 13, 14, 15, 16, 
    17 ,18, 19, 20]

integers.map{
   // your code here
}

(我原来的答复错过了这个区别,我现在已经改正了。参见如何转换一系列其他的答案为Int数组)


两者都将括号内执行该块的21倍,一个用于所述阵列中的每个整数。

但与此相反的for循环中,map()功能有望(,整数通过0 20在这种情况下)返回一些类型,其中,通过将每个元素的原始数组中获得的各元素的数组转换成一个实例所得到的类型。例如:

let textRepresentations: [String] = integers.map {
    return "\($0)"
}

// Now textRepresentations contains "0", "1", etc.

如果你的目标是组建一个数组出对象的基础上那些21个整数创建,map()给你一个更好的解决方案比你更“C类”的方式,例如:是否已完成:

var textRepresentations: [String] = []
for i in 0 ... 20 {
     textRepresentations.append("\(i)")
}

但是,如果你只需要一次为每个整数执行一些逻辑,没有阵列留下的结果,使用map()(和丢弃结果)会显得笨拙而困惑的人必须保持代码(包括你的未来的自己) 。

此外,更多的“SWIFTY”替代for ... in环是foreach(看起来更有点像map(),减去返回的数组):

integers.foreach {
    // (use $0 instead of i)
}

...or, more verbosely:

integers.foreach { (element) in
    // (use `element`, of course)
}

0
投票

为了让您的确切语法,你可以创建扩展:

extension Array where Element == ClosedRange<Int> {

    @discardableResult
    func map(_ f: @escaping(Int) -> Void) -> [Int]{

        var result : [Int] = []

        for i in 0 ..< self[0].count {
            result.append(i)
            f(i)
        }

        return result
    }
}

并调用它是这样的:

let items = [0...50].map {
    print($0) // current index
}

print(items)

请注意,项目将[Int],这能解决您的编辑之前你的问题,当你只是想写一个for循环是这样的:

[0...50].map {
    print($0) // current index
}
© www.soinside.com 2019 - 2024. All rights reserved.