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

Is it possible to create an optional and non-optional version of a swift protocol dynamically?

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

我有很多来自服务器的数据需要解析并转换成结构。 假设我从服务器获取 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),但是我处理来自服务器的信息后,我想创建一个非可选结构。

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

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

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

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

如果您需要帮助创建 failable initializer,可以参考此 link。