【问题标题】:Is it possible to create an optional and non-optional version of a swift protocol dynamically?是否可以动态创建 swift 协议的可选和非可选版本?
【发布时间】:2016-07-19 18:32:41
【问题描述】:

我需要关于我应该采取的最佳方法的建议。

我有很多来自服务器的数据,我需要将其解析为结构。 假设我从服务器获取seller 信息,结构可能如下所示:

struct Seller {
    var firstName: String?
    var lastName: String?
    var address: String?
}

我为此创建了一个协议,并让我的卖家结构采用它。所以我的代码现在看起来像这样:

protocol SellerProtocol {
    var firstName: String {get set}
    var lastName: String {get set}
    var address: String {get set}
}

extension Seller: SellerProtocol {
    var firstName: String?
    var lastName: String?
    var address: String?
}

问题:有没有办法让这个协议中的所有变量动态地变成非可选的?

问题是,我有很多这样的可选协议,但是,我还需要声明完全相同协议的非可选版本,以便其他类可以遵守它。我只希望与服务器直接交互的结构是可选类型(因为来自服务器的数据可以包含 nil),但是在处理来自服务器的信息之后,我想创建一个非可选结构。

那么我需要维护完全相同协议的两个版本吗?可选版本和非可选版本?

【问题讨论】:

  • 我相信您想要做的是将协议声明为非可选的,然后使用可失败的初始化程序来创建您的结构。这样,如果您缺少某些属性,对象初始化将失败,但如果初始化成功,您将拥有所需的所有数据。
  • 谢谢.. 但你为什么不写一个答案?我不能接受评论作为答案。
  • @AdamPro13:我同意,这就是要走的路

标签: ios swift generics swift-protocols


【解决方案1】:

您要做的是将协议声明为非可选的,然后使用可失败的初始化程序来创建您的结构。这样,如果您缺少某些属性,对象初始化将失败,但如果初始化成功,您将拥有所需的所有数据。

如果您在创建failable initializer 时需要帮助,可以参考此链接。

【讨论】:

    【解决方案2】:

    不,没有办法动态更改协议所需的属性/方法或其中使用的类型。协议是合约,编译器需要能够将其视为不变量,以便分析和验证您的代码。在运行时更改协议(或类型符合的协议)本质上会破坏您在构建时向编译器承诺的合同。

    在我看来,如果卖家绝对希望在您的应用程序中拥有这些属性,那么您的 SellerProtocol 应该包含可选项。在您从服务器获取数据的时候,为什么要求可能为 nil 的数据的临时/临时表示完全符合该协议?似乎只有当数据不是 nil / 缺失时,您才会用它填充符合 SellerProtocol 的类型。

    【讨论】:

      猜你喜欢
      • 2020-12-07
      • 2014-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-06
      • 1970-01-01
      • 2023-03-23
      相关资源
      最近更新 更多