Arrays Swift中的重复数组
在Python中,我可以创建如下重复列表: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
>>> [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改为Intself.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]