2015-05-13 168 views
2

的多个子阵列的阵列比方说,我有这个字符串数组:斯威夫特 - 字符串以恒定数量的字符串

let Vehicles = ["Aeroplane", "Bicycle", "CarVehicle", "Lorry", "Motorbike", "Scooter", "Ship", "Train"] 

我想是这样的结果:

let resultArray = [["Aeroplane", "Bicycle", "CarVehicle", "Lorry"], ["Motorbike", "Scooter", "Ship", "Train"]] 

我知道我可以通过for做到这一点,但我想在Swift中使用高阶函数。我的意思是像地图,缩小,过滤等功能。我认为这样做可能会更好。谁能帮我这个?感谢

+0

参见[我的回答(http://stackoverflow.com/a/33540708/1966109)替换它的非常类似的问题,提供高达5种不同的方式来解决你的问题。 –

回答

5

map()stride()一种可能的解决方案:

let vehicles = ["Aeroplane", "Bicycle", "CarVehicle", "Lorry", "Motorbike", "Scooter", "Ship", "Train"] 
let each = 4 

let resultArray = map(stride(from: 0, to: vehicles.count, by: each)) { 
    vehicles[$0 ..< advance($0, each, vehicles.count)] 
} 

println(resultArray) 
// [[Aeroplane, Bicycle, CarVehicle, Lorry], [Motorbike, Scooter, Ship, Train]] 

在闭合保证advance()该代码 工作即使数组元素的数量不是4 的倍数的使用(以及然后在结果最后子阵列会更短。)

你可以把它简化为

let resultArray = map(stride(from: 0, to: vehicles.count, by: each)) { 
    vehicles[$0 ..< $0 + each] 
} 

,如果你知道数组元素的个数是4

多严格地说resultArray的元素是不能阵列 但阵列片。在许多情况下,这并不重要,否则你 可以通过

let resultArray = map(stride(from: 0, to: vehicles.count, by: each)) { 
    Array(vehicles[$0 ..< advance($0, each, vehicles.count)]) 
} 
+0

看起来像我在找什么。我忘记提及的元素数量不需要是4的倍数,所以感谢第一个解决方案。还有一件事。我有问题,我的结果是'ArraySlice '不是'[String]'。我该如何解决它? –

+0

@LiborZapletal:查看更新的答案。 –

+0

@MartinR同样可以用'reduce'和'map'来完成吗? – Eendje