繁体   English   中英

如何同时迭代两个包含自定义类的arrays

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM