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:我同意,这是正确的选择