Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在struct中设置枚举以用作初始化自定义对象的标识符_Ios_Swift - Fatal编程技术网

Ios 如何在struct中设置枚举以用作初始化自定义对象的标识符

Ios 如何在struct中设置枚举以用作初始化自定义对象的标识符,ios,swift,Ios,Swift,我想为我的结构设置一个自定义枚举,以便在我将它们全部放入同一数组后能够识别它们自己。我使我的结构符合相同的协议,这样我就不必使用任何/AnyObject,但现在我在正确的方法上遇到了问题,无法在结构内设置枚举,并创建一个函数来在之后将对象恢复到其原始状态 目前,通过将所有结构都符合相同的协议,我将它们放在一个数组中 struct Artist: Decodable, ContentWrapper { let name: String let image: [[String:Str

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

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

这里要使用的工具是用于保存数据的枚举,而不是用于保存类型的枚举。完全摆脱ContentWrapper,并将其替换为以下内容:

enum Element {
    case artist(Artist)
    case album(Album)
}

var elements: [Element] = []
现在elements是一组艺术家或专辑,我相信这就是你想要的。您在Swift中表示类型或其他类型的方式是使用枚举

要处理不同的元素类型,通常使用switch:


既然你是从一个协议开始的,专辑和艺术家都必须有相同的东西,我猜这就是你提到的类型。因此,也许您可以在协议中创建一个属性类型,并在Album和Artister中实现。然后在[ContentWrapper]中声明一个数组

协议内容包装器{ 变量类型:字符串{get} } 扩展ContentWrapper,其中Self==Artist{ 变量类型:字符串{ 回归艺术家 } } 扩展ContentWrapper,其中Self==相册{ 变量类型:字符串{ 返回相册 } } var artist=艺人姓名:Ed Sheeran,图片:[] var album=Albumname:Loose Change,艺术家:Ed Sheeran,图像:[] let数组:[ContentWrapper]=[艺术家,专辑] 用于数组中的项{ 打印标识符:\item.type } //输出: //识别人:艺术家 //标识符:相册
为什么不在你的物品周围贴上标识呢?enum ContentWrapper{case Artististist case AlbumAlbumAlbum,然后创建一个数组[ContentWrapper]?这也可以,但是我如何从数组中检索该项?它仍然是我正在查找的enum的形式。但是,我如何从新数组中接收原始元素?
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
    }
}