Arrays Swift中的重复数组

Arrays Swift中的重复数组,arrays,swift,Arrays,Swift,在Python中,我可以创建如下重复列表: >>> [1,2,3]*3 [1, 2, 3, 1, 2, 3, 1, 2, 3] 在Swift中有没有一种简洁的方法可以做到这一点 我所能做的就是: 1> var r = [Int]() r: [Int] = 0 values 2> for i in 1...3 { 3. r += [1,2,3] 4. } 5> print(r) [1, 2, 3, 1, 2, 3, 1, 2, 3

在Python中,我可以创建如下重复列表:

>>> [1,2,3]*3
[1, 2, 3, 1, 2, 3, 1, 2, 3]
在Swift中有没有一种简洁的方法可以做到这一点

我所能做的就是:

  1> var r = [Int]()
r: [Int] = 0 values
  2> for i in 1...3 { 
  3.     r += [1,2,3]
  4. }
  5> print(r)
[1, 2, 3, 1, 2, 3, 1, 2, 3]

解决方案1:

func multiplerArray(array: [Int], time: Int) -> [Int] {
    var result = [Int]()
    for _ in 0..<time {
        result += array
    }
    return result
}
let arrays = Array(count:3, repeatedValue: [1,2,3])
// [[1, 2, 3], [1, 2, 3], [1, 2, 3]]
var result = [Int]()
for array in arrays {
    result += array
}
print(result) //[1, 2, 3, 1, 2, 3, 1, 2, 3]
解决方案2:

func multiplerArray(array: [Int], time: Int) -> [Int] {
    var result = [Int]()
    for _ in 0..<time {
        result += array
    }
    return result
}
let arrays = Array(count:3, repeatedValue: [1,2,3])
// [[1, 2, 3], [1, 2, 3], [1, 2, 3]]
var result = [Int]()
for array in arrays {
    result += array
}
print(result) //[1, 2, 3, 1, 2, 3, 1, 2, 3]

您可以使用模运算对基本集合进行索引计算,并为此进行函数编程:

let base = [1, 2, 3]
let n = 3 //number of repetitions
let r = (0..<(n*base.count)).map{base[$0%base.count]}
然后,您可以像在python中一样使用函数:

[1, 2, 3] * 3
// will evaluate to [1, 2, 3, 1, 2, 3, 1, 2, 3]

您可以创建二维阵列,然后使用
flatMap
将其转换为一维阵列:

let array = [Int](repeating: [1,2,3], count: 3).flatMap{$0}
下面是一个扩展,它添加了一个init方法和一个repeating方法,该方法采用一个数组,这使它更简洁:

extension Array {
  init(repeating: [Element], count: Int) {
    self.init([[Element]](repeating: repeating, count: count).flatMap{$0})
  }

  func repeated(count: Int) -> [Element] {
    return [Element](repeating: self, count: count)
  }
}

let array = [1,2,3].repeated(count: 3) // => [1, 2, 3, 1, 2, 3, 1, 2, 3]
请注意,如果使用新的初始值设定项而不提供预期类型,则可能会得到不明确的方法调用:

let array = Array(repeating: [1,2,3], count: 3) // Error: Ambiguous use of ‛init(repeating:count:)‛
改用:

let array = [Int](repeating: [1,2,3], count: 3) // => [1, 2, 3, 1, 2, 3, 1, 2, 3]


如果将方法签名更改为
init(repeatingContentsOf:[Element],count:Int)
或类似值,则可以避免这种歧义。

使用Swift 5,可以创建一个
数组
扩展方法,以便将给定数组的元素重复到新数组中。下面的示例代码显示了此方法的可能实现:

extension Array {

    func repeated(count: Int) -> Array<Element> {
        assert(count > 0, "count must be greater than 0")

        var result = self
        for _ in 0 ..< count - 1 {
            result += self
        }

        return result
    }

}

let array = [20, 11, 87]
let newArray = array.repeated(count: 3)
print(newArray) // prints: [20, 11, 87, 20, 11, 87, 20, 11, 87]
扩展数组{
func重复(计数:Int)->数组{
断言(计数>0,“计数必须大于0”)
var结果=自身
对于0中的uu..<计数-1{
结果+=自我
}
返回结果
}
}
让数组=[20,11,87]
让newArray=array.repeated(计数:3)
print(newArray)//prints:[20,11,87,20,11,87,20,11,87]

如果需要,还可以创建中缀运算符来执行此操作:

infix operator **

extension Array {

    func repeated(count: Int) -> Array<Element> {
        assert(count > 0, "count must be greater than 0")

        var result = self
        for _ in 0 ..< count - 1 {
            result += self
        }

        return result
    }

    static func **(lhs: Array<Element>, rhs: Int) -> Array<Element> {
        return lhs.repeated(count: rhs)
    }

}

let array = [20, 11, 87]
let newArray = array ** 3
print(newArray) // prints: [20, 11, 87, 20, 11, 87, 20, 11, 87]
中缀运算符**
扩展阵列{
func重复(计数:Int)->数组{
断言(计数>0,“计数必须大于0”)
var结果=自身
对于0中的uu..<计数-1{
结果+=自我
}
返回结果
}
静态函数**(左:数组,右:Int)->数组{
返回左侧。重复(计数:右侧)
}
}
让数组=[20,11,87]
设newArray=array**3
print(newArray)//prints:[20,11,87,20,11,87,20,11,87]

非常酷!然而,我不想在Swift中实现Python语法。可能不利于代码的可读性。您需要将count参数类型更改为Int以将其用作索引,或者强制从Uint改为Int
self.init([Array](count:Int(count),repeatedValue:repeatedValues)。flatMap{$0})
ah,是的,当我测试它时,我使用的代码与我在这里发布的代码略有不同。我将其更改为更好地匹配原始的
init
方法。
infix operator **

extension Array {

    func repeated(count: Int) -> Array<Element> {
        assert(count > 0, "count must be greater than 0")

        var result = self
        for _ in 0 ..< count - 1 {
            result += self
        }

        return result
    }

    static func **(lhs: Array<Element>, rhs: Int) -> Array<Element> {
        return lhs.repeated(count: rhs)
    }

}

let array = [20, 11, 87]
let newArray = array ** 3
print(newArray) // prints: [20, 11, 87, 20, 11, 87, 20, 11, 87]