Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 是否可以动态创建swift协议的可选和非可选版本?_Ios_Swift_Generics_Swift Protocols - Fatal编程技术网

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

Ios 是否可以动态创建swift协议的可选和非可选版本?,ios,swift,generics,swift-protocols,Ios,Swift,Generics,Swift Protocols,我需要关于我应该采取的最佳方法的建议 我有很多来自服务器的数据需要在转换为结构时解析。 假设我正在从服务器获取卖方信息,结构可能如下所示: struct Seller { var firstName: String? var lastName: String? var address: String? } protocol SellerProtocol { var firstName: String {get set} var lastName: Str

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

我有很多来自服务器的数据需要在转换为结构时解析。 假设我正在从服务器获取
卖方
信息,结构可能如下所示:

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?
}
我已经为此创建了一个协议,并让我的卖方结构采用它。现在我的代码如下所示:

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的类型

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


如果您需要帮助创建,可以引用此链接。

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