我对swift很新,我正在使用collectionview开发应用程序。我喜欢在同一部分中订购具有相同标签的所有图像。所以我必须有带有相同标签的图像的数组。 具有以下值的示例主数组:
结果我喜欢有以下数组:一个带标签a,一个带标签b,依此类推。
我找到了一个函数(感谢stackoverflow)从主数组中获取所有不同的值。我已经将它用于了多个部分。它如下:
func uniq<S: SequenceType, E: Hashable where E==S.Generator.Element>(seq: S) -> [E] {
var seen: [S.Generator.Element:Int] = [:]
return filter(seq) { seen.updateValue(1, forKey: $0) == nil }
}
我知道你必须通过主阵列。 我一直在考虑这个问题,但我找不到一个很好的解决方案,除了这个没有工作的代码
var distinctArray=uniq(main_array)
//CREATE ARRAYS FOR ALL DISTINCT VALUES
for var index = 0; index < distinctArray.count; index++ {
var "\(distinctArray[index])" = []
//I KNOW THIS WILL NOT WORK BUT HOW DO YOU DO THIS, GIVE AN ARRAY A NAME OF A VALUE OF AN ARRAY?
}
//GOING THROUGH THE ARRAY AND ADD THE VALUE TO THE RIGHT ARRAY
for var index = 0; index < main_array.count; index++ {
for var index2 = 0; index2 < distinctArray.count; index2+=1{
if main_array[index]==distinctArray[index2]{
"\(distinctArray[index])".append(main_array[index])
}
}
}
有人可以给我一个提示吗?也许我在使用之前的非工作代码时走错了路。
答案 0 :(得分:1)
看起来你想要的是创建一个新的字典,其中键是标记,数组是带有该标记的图像:
struct Image {
let name: String
let tag: String
}
let imageArray = [
Image(name: "Image1", tag: "a"),
Image(name: "Image2", tag: "b"),
Image(name: "Image3", tag: "b"),
Image(name: "Image4", tag: "a"),
Image(name: "Image5", tag: "c"),
]
func bucketImagesByTag(images: [Image]) -> [String:[Image]] {
var buckets: [String:[Image]] = [:]
for image in images {
// dictionaries and arrays being value types, this
// is unfortunately not as efficient as it might be...
buckets[image.tag] = (buckets[image.tag] ?? []) + [image]
}
return buckets
}
// will return a dictionary with a: and b: having
// arrays of two images, and c: a single image
bucketImagesByTag(imageArray)
如果你想使这个通用,你可以编写一个带有集合的函数,以及一个识别桶的密钥的函数,并将密钥中的字典返回到元素数组。
func bucketBy<S: SequenceType, T>(source: S, by: S.Generator.Element -> T) -> [T:[S.Generator.Element]] {
var buckets: [T:[S.Generator.Element]] = [:]
for element in source {
let key = by(element)
buckets[key] = (buckets[key] ?? []) + [element]
}
return buckets
}
// same as bucketImagesByTag above
bucketBy(imageArray) { $0.tag }
有趣的是,T
被用来键入返回的字典这一事实意味着Swift可以推断它必须是可清除的,因此与uniq
不同,您不必明确要求它。< / p>