我想为我的结构设置一个自定义的枚举,以便将它们全部放入同一数组后就可以标识自己。我使我的结构符合相同的协议,所以我不必使用Any / AnyObject,但是现在我在正确的方法上遇到麻烦,无法在结构中设置枚举并创建一个函数来将对象恢复为原始状态事后声明。
通过将所有结构都遵循相同的协议,我目前将所有结构都放在一个数组中
struct Artist: Decodable, ContentWrapper {
let name: String
let image: [[String:String]]
init(name: String, image: [[String:String]]) {
self.name = name
self.image = image
}
}
struct Album: Decodable, ContentWrapper {
let name: String
let artist: String
let image: [[String:String]]
init(name: String, artist: String, image: [[String:String]]) {
self.name = name
self.artist = artist
self.image = image
}
}
enum myType {
case type(String)
}
protocol ContentWrapper {
}
我需要为每个结构体设置一个枚举,以便能够识别它们自己,然后在从数组中接收到它们之后,具有一个将它们返回到其原始对象的功能。
答案 0 :(得分:1)
您要在此处使用的工具是用于保存数据的枚举,而不是用于保存类型的枚举。完全摆脱ContentWrapper
并替换为:
enum Element {
case artist(Artist)
case album(Album)
}
var elements: [Element] = []
现在elements
是一系列“艺术家或专辑”,我相信这是您所需要的。在Swift中您说“类型或其他类型”的方式就是枚举。
要处理不同的元素类型,通常使用switch
:
for element in elements {
switch element {
case .artist(let artist):
// Perform "artist-like" functions on `artist`
break
case .album(let album):
// Perform "album-like" functions on `album`
break
}
}
答案 1 :(得分:0)
自从您开始使用协议以来,Album
和Artist
必须具有相同的内容,而我猜这就是您提到的type
。因此,也许您只能在协议中使用属性type
并在Album
和Artist
中实现。然后,声明一个数组[ContentWrapper]
。
protocol ContentWrapper {
var type: String { get }
}
extension ContentWrapper where Self == Artist {
var type: String {
return "Artist"
}
}
extension ContentWrapper where Self == Album {
var type: String {
return "Album"
}
}
var artist = Artist(name: "Ed Sheeran", image: [])
var album = Album(name: "Loose Change", artist: "Ed Sheeran", image: [])
let array: [ContentWrapper] = [artist, album]
for item in array {
print("identifier: \(item.type)")
}
// Output:
// identifier: Artist
// identifier: Album