![](/img/trans.png)
[英]iterate through two custom arrays and set values if variables are equal Swift
[英]How to iterate two arrays both containing custom classes simultaneously
假设你有课程:
class Artwork {
var title = ""
var location =""
var author = ""
}
class GroupedArtworks {
var location = ""
var artworks = [Artworks]()
}
那么你有一个变量,其中包含 class “艺术品”的几个对象:
var arts = [artwork1, artwork2...]
我如何按“位置”对 class“艺术品”的对象进行分组?
我想以另一个包含 class“GroupedArtworks”对象的变量结束,对于每个 object,属性“artworks”中的所有对象都具有相同的“位置”,例如:
var orderedArtworks = [groupedartworks1, groupedartworks2...]
毫无疑问,这里涉及到循环。
使用 Swift 的 Dictionary init(grouping:by:)
解决方案非常简单
let artworks: [Artwork] = []
// dictionary type will be [String: [Artwork]]
let dictionary = Dictionary(grouping: artworks, by: \.location)
// now we can easy iterate over (key: String, value: [Artwork]) pairs
let groups: [GroupedArtworks] = dictionary.map { location, artworks in
GroupedArtworks(location: location, artworks: artworks)
}
// or simply
let groups = dictionary.map(GroupedArtworks.init)
// Swift will infer the types of dictionary and the init
但您需要将此初始化添加到您的GroupedArtworks
class GroupedArtworks {
let location: String
let artworks: [Artwork]
init(location: String, artworks: [Artwork]) {
self.location = location
self.artworks = artworks
}
}
正如有人在评论中正确指出的那样,由于字典是无序的 collections,因此您的GroupedArtworks
数组也将是无序的。 但这应该不是问题,因为您可以轻松地按location
对它进行排序。
let groups = dictionary.map(GroupedArtworks.init).sorted(by: \.location)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.