【发布时间】:2017-04-12 08:12:04
【问题描述】:
我正在尝试为我的应用制作数据模型。这是场景:
我的应用具有包含客户信息的客户模型,还包含他/她的付款来源。 API 为我提供了两种支付来源:card 和 bank account,它们具有完全不同的字段。
所以,这是我的问题,我想要一个抽象类型,即 PaymentSource,然后在每个 PaymentSource 中都有一个函数来返回转换为它的类型的对象。一些我是如何键入擦除的。
我需要将我的抽象类型放在一个盒子中,并将其用作具体类型 (AnyPaymentSource)。
所以,我做了以下工作:
protocol PaymentSource {
associatedtype Kind
func cast() -> Kind
}
struct AnyPaymentSource<PS: PaymentSource> {
private var paymentSource: PS
init(paymentSource: PS) {
self.paymentSource = paymentSource
}
func cast() -> PS.Kind {
return paymentSource.cast()
}
}
struct Card: PaymentSource {
func cast() -> Card {
return self
}
}
struct BankAccount: PaymentSource {
func cast() -> BankAccount {
return self
}
}
struct Customer {
var firstName: String
var lastName: String
var email: String
var paymentSource : AnyPaymentSource<PaymentSource>
}
但是Customer 给了我以下描述的错误:
不支持将“PaymentSource”用作符合协议“PaymentSource”的具体类型
我哪里做错了?
【问题讨论】:
-
泛型类型
PS必须是具体类型,例如BankAccount或Card,而不是它所遵循的协议。 -
@vadian 那么为什么要为客户的 PaymentSource 创建抽象类型呢?我需要在不知道它是什么类型的情况下存储付款来源。然后稍后在代码中获取类型
-
这些
PaymentSource结构的目的是什么?事实上,对于这两种付款方式,您最好使用enum。 -
@XmasRights true 我可以将枚举与泛型一起使用,但后来我必须使用大量的 switch case。我正在寻找更优雅的解决方案,例如关联类型
标签: swift generics type-erasure swift-protocols associated-types