当前位置: 首页 > 面试题库 >

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

洪鸿
2023-03-14
问题内容

我正在尝试通过符合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!)

问题答案:

解决方案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()


 类似资料:
  • 我对Swift中关于var和关键字{get set}的使用的协议有疑问。 来自Apple文档: 这将不是公正的: 我错过了什么?

  • 问题内容: 采用以下协议和扩展名: 这与将函数完全排除在协议定义之外有什么区别(例如): 我发现了一个区别。如果我定义了一个覆盖默认实现的结构,则仅当将函数放在定义之外时,我才能将其强制转换为协议并调用协议的实现: 换句话说,如果您像in中那样 从协议定义中删除 函数,则可以通过将对象强制转换为协议来访问默认实现。另一方面,如果将函数保留在协议定义中,则无法转换为协议以获取默认协议行为。 将功能定

  • 问题内容: 如果我使用以下代码,则会向我显示错误“类型’HttpConnection’不符合协议’NSObjectProtocol’” 如果我将HttpConnection子类化为NSObject,则可以正常工作。所以我的问题是,当我需要迅速采用NSURLConnectionDataDelegate协议时,为什么需要从NSObject继承该类? 问题答案: 本身继承自。 这意味着除了实现,和中的所

  • 问题内容: 我已经看到了这个“快速平等协议”问题的答案,该问题提到了如何在全局范围内声明该方法。 如果我不采用,我仍然可以声明测试两种类型之间的相等性。 需要在全局范围内声明其实现这一事实,这使得该协议似乎是 附带的 ,也与协议 有所不同 ,即使已被采纳。 该协议除了仅使(我们和)编译器安全地知道我们的类型实现了协议所需方法的语法糖外,还有什么? 为什么即使对于协议,也必须全局声明操作员实现?这是

  • 这是SWIFT中的有效协议声明: 但这不是: 错误消息为: 协议“proto2”只能用作泛型约束,因为它具有自身或关联的类型要求 因此,当使用作为函数的返回类型时,Swift并不认为这是所定义协议的约束,因此可以使用协议本身作为函数的返回类型。但是当使用作为函数的参数类型时,其行为是完全不同的。 我想知道为什么会有这样的差别?

  • 问题内容: 我想声明一个type 。 为什么以下原因给我一个错误: 但是以下工作原理: ? 问题答案: 只能引用类型,不能引用基元。是一类,而不是原始的。 声明时,您将创建一个将存储类型而不是原始类型的。 如果您想了解基本类型和引用类型之间的区别,请查看http://pages.cs.wisc.edu/~hasti/cs302/examples/primitiveVsRef.html