我正在尝试为我的应用程序创建数据模型。这里是场景:将抽象类型转换为Swift中的混凝土类型
我的应用程序有客户模型,其中包含客户的信息,也包含他/她的支付来源。该API给我两种支付来源:卡和银行帐户他们有完全不同的领域。
所以,这里是我的问题,我想要具有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
@vadian那么为什么还要为客户的PaymentSource创建抽象类型呢?我需要存储付款来源而不知道它是什么类型。然后在代码中获取类型 – Mohammadalijf
这些'PaymentSource'结构的目的是什么?实际情况是,您最好为两种支付来源提供'enum'。 – XmasRights