gpt4 book ai didi

swift - 枚举关联值令人困惑

转载 作者:可可西里 更新时间:2023-11-01 01:56:10 25 4
gpt4 key购买 nike

当我尝试使用 func obj func 时,出现错误:

Cannot invoke 'obj' with an argument list of type '(message: (QueueAddable))'

我对 Swift 类型感到困惑。Obj func 用于获取解码的具体类型。

protocol QueueAddable: Encodable {
var playlistsCollection:String? { get }
var playlists: [String]? { get }
}

struct Playlist: QueueAddable {
var playlistsCollection:String? {
return "id"
}
var playlists: [String]? {
return ["id", "id2"]
}
private enum CodingKeys:String,CodingKey {
case playlistsCollection
case playlists
}

public func encode(to encoder: Encoder) throws {
var values = encoder.container(keyedBy: CodingKeys.self)
try values.encode(playlistsCollection, forKey: Playlist.CodingKeys.playlistsCollection)
try values.encode(playlists, forKey: .playlists)
}
}

func obj<Q>(message: Q) where Q: QueueAddable {
let encoder = JSONEncoder()
let data = try! encoder.encode(message)
}

enum SomeEnum {
case playlist(QueueAddable)
func doSome() throws -> Data {
switch self {
case .playlist(let queueAddable):
let encoder = JSONEncoder()

// Error on the following line:
obj(message: queueAddable)
return Data()
}
}
}

let playlist = Playlist()
let data = try SomeEnum.playlist(playlist).doSome()

最佳答案

我认为问题在于函数需要类型而不是协议(protocol)。如果您使用实现该协议(protocol)的类型使枚举通用,它将起作用。

像这样更改枚举的前两行:

enum SomeEnum<Q : QueueAddable> {
case playlist(Q)

我在以下 Playground 进行了测试:

import Foundation

protocol QueueAddable: Encodable {
var playlistsCollection:String? { get }
var playlists: [String]? { get }
}

struct Playlist: QueueAddable {
var playlistsCollection:String? {
return "id"
}
var playlists: [String]? {
return ["id", "id2"]
}
private enum CodingKeys:String,CodingKey {
case playlistsCollection
case playlists
}

public func encode(to encoder: Encoder) throws {
var values = encoder.container(keyedBy: CodingKeys.self)
try values.encode(playlistsCollection, forKey: Playlist.CodingKeys.playlistsCollection)
try values.encode(playlists, forKey: .playlists)
}
}

func obj<Q>(message: Q) where Q: QueueAddable {
let encoder = JSONEncoder()
let data = try! encoder.encode(message)
}

enum SomeEnum<Q : QueueAddable> {
case playlist(Q)
func doSome() throws -> Data {
switch self {
case .playlist(let queueAddable):
let encoder = JSONEncoder()

// No longer error on the following line:
obj(message: queueAddable)
return Data()
}
}
}

let playlist = Playlist()
let data = try SomeEnum.playlist(playlist).doSome()

希望对您有所帮助!

关于swift - 枚举关联值令人困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53228267/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com