我正在尝试通过符合Encodable协议的编码模型来获取数据。但是它无法encode像下面的代码那样调用func :
Encodable
encode
// 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!)
解决方案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()