小编典典

为什么不能在功能中使用协议“ Encodable”作为类型

swift

我正在尝试通过符合Encodable协议的编码模型来获取数据。但是它无法encode像下面的代码那样调用func :

// MARK: - Demo2

class TestClass2: NSObject, Encodable {
    var x = 1
    var y = 2
}


var dataSource2: Encodable?

dataSource2 = TestClass2()

// error: `Cannot invoke 'encode' with an argument list of type '(Encodable)'`
let _ = try JSONEncoder().encode(dataSource2!)
//func encode<T>(_ value: T) throws -> Data where T : Encodable

但是在另一个演示中,效果很好,为什么呢?

// MARK: - Demo1

protocol TestProtocol {
    func test()
}

class TestClass1: NSObject, TestProtocol {
    func test() {
        print("1")
    }

    var x = 1
    var y = 2
}


var dataSource1: TestProtocol?

dataSource1 = TestClass1()


func logItem(_ value: TestProtocol) {
    value.test()
}

logItem(dataSource1!)

阅读 256

收藏
2020-07-07

共1个答案

小编典典

解决方案1。

https://github.com/satishVekariya/SVCodable

试试这个代码,它扩展了可编码

extension Encodable {
    func toJSONData() -> Data? { try? JSONEncoder().encode(self) }
}

解决方案2。

避免污染带有扩展名的Apple提供的协议

protocol MyEncodable: Encodable {
    func toJSONData() -> Data?
}

extension MyEncodable {
    func toJSONData() -> Data?{ try? JSONEncoder().encode(self) }
}

var dataSource2: Encodable?
dataSource2 = TestClass2()
let data = dataSource2?.toJSONData()
2020-07-07