是否可以动态创建swift协议的可选和非可选版本?

时间:2016-07-19 18:32:42

标签: ios swift generics swift-protocols

我需要就我应采取的最佳方法提出建议。

我有很多来自服务器的数据,我需要在转换为结构时进行解析。 所以,让我说我从服务器获取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?
}

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

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

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

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