如何在结构中设置一个枚举以用作初始化自定义对象的标识符

时间:2019-02-14 22:53:14

标签: ios swift

我想为我的结构设置一个自定义的枚举,以便将它们全部放入同一数组后就可以标识自己。我使我的结构符合相同的协议,所以我不必使用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 {
}

我需要为每个结构体设置一个枚举,以便能够识别它们自己,然后在从数组中接收到它们之后,具有一个将它们返回到其原始对象的功能。

2 个答案:

答案 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)

自从您开始使用协议以来,AlbumArtist必须具有相同的内容,而我猜这就是您提到的type。因此,也许您只能在协议中使用属性type并在AlbumArtist中实现。然后,声明一个数组[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