【发布时间】:2021-12-22 16:29:57
【问题描述】:
我在 iOS 应用程序中使用 Apollo for Swift。我有多种类型都代表同一个对象。这些类型是从架构文件自动生成的,看起来像这样。
struct CurrentUser {
var id: String
...
}
struct MyUser {
var id: String
...
}
基本上,Apollo 为相同的底层数据类型生成多个 Swift 类型(每个查询一个)。
我想创建一个统一这些类型的新结构。
我想做这样的事情:
protocol UserProtocol {
var id: String { get }
}
struct User {
var id: String
...
init(_ data: UserProtocol) {
self.id = data.id
...
}
}
但是,当我尝试构造用户对象时,这种方法给了我一个错误,告诉我“Type MyUser 不符合 UserProtocol”。如果我尝试使用 data as! UserProtocol 强制类型,我会崩溃。
我找到的唯一解决方案如下:
enum UserType {
case .currentUser(CurrentUser)
case .myUser(MyUser)
}
struct User {
var id: String
...
init(_ data: UserType) {
switch data {
case .myUser(let user):
self.id = data.id
...
case .currentUser(let user):
self.id = data.id
...
}
}
}
这种方法可行,但会导致init 函数中出现大量重复代码。在 Swift 中有没有更好的方法来做到这一点?
【问题讨论】: