以下代码没有编译:
public protocol Foo: Decodable {
var message: String { get }
}
struct Bar: Foo {
let message: String
}
// the type conforming Foo protocol is passed from somewhere
let type: Foo.Type = Bar.self
decode(type: type, from: Data())
func decode<T>(type: T.Type, from data: Data) Where T: Decodable {
let decoder = JSONDecoder()
try! decoder.decode(type, from: data)
}它抛出错误:Cannot invoke 'decode' with an argument list of type '(Foo.Type, from: Data)'
你们知道吗?
发布于 2017-10-14 04:45:12
你可以这样使用:
public protocol Foo: Decodable {
var message: String { get }
}
struct Bar: Foo {
let message: String
}
class ViewController: UIViewController {
let bar = """
{"message": "Sample message"}
"""
override func viewDidLoad() {
super.viewDidLoad()
let type = Bar.self
decode(type: type, from: bar.data(using: .utf8)!)
}
func decode<Foo>(type: Foo.Type, from data: Data) where Foo: Decodable {
let decoder = JSONDecoder()
let parsedData = try! decoder.decode(type, from: data)
print(parsedData)
}
}发布于 2017-10-14 03:33:53
您应该在您的Bar上使用Bar来代替:
protocol Foo {
var message: String { get }
}
struct Bar: Foo, Codable {
let message: String
}用法:
let bar = Bar(message: "Just a message")
if let data = try? JSONEncoder().encode(bar) {
print(String(data:data, encoding:.utf8) ?? "") // {"message":"Just a message"}\n"// lets decode it
if let decodedBar = try? JSONDecoder().decode(Bar.self, from: data) {
print(decodedBar.message) //"Just a message\n"
}
}https://stackoverflow.com/questions/46740520
复制相似问题