gpt4 book ai didi

swift - 是否有一些解决方法可以在不知道定义的元素类型是什么的情况下转换为通用基类?

转载 作者:搜寻专家 更新时间:2023-11-01 05:35:58 25 4
gpt4 key购买 nike

我正在尝试实现一种设计,其中我可以拥有一个具有通用属性的基类,我可以通过遵守协议(protocol)来更改其值。

protocol EnumProtocol {
static var startValue: Self { get }
func nextValue() -> Self
}

enum FooState: EnumProtocol {
case foo1, foo2
static var startValue: FooState { return .foo1 }
func nextValue() -> FooState {
switch self {
case .foo1:
return .foo2
case .foo2:
return .foo1
}
}
}

enum BarState: EnumProtocol {
case bar
static var startValue: BarState { return .bar }
func nextValue() -> BarState {
return .bar
}
}


class BaseClass<T: EnumProtocol> {
var state = T.startValue
}

class FooClass: BaseClass<FooState> {
}

class BarClass: BaseClass<BarState> {
}

是否有可能以类似于此的解决方案结束,其中元素类型未知且值依赖于 nextValue() 方法。

let foo = FooClass()
let bar = BarClass()
if let test = bar as? BaseClass {
test.state = test.state.nextValue()
}

这行得通,但是 BarState 在我的例子中是未知的,很多类都是 BaseClass 的子类并且有不同的状态类型。

let bar = BarClass()
if let test = bar as? BaseClass<BarState> {
test.state = test.state.nextValue()
}

这是一个简化的例子。在我的例子中,我将得到一个 SKNode 子类,它有一个 state 属性,它是一个带有 nextvalue 方法的枚举,该方法定义了规则来决定下一个值是什么。我正在尝试对此进行通用实现,它仅依赖于从 nextValue 方法返回的内容。是否有更好的模式来实现这一目标?

最佳答案

这不适用于这种情况,因为 EnumProtocol 不能用作具体类型,因为它有 Self 类型要求,但是,为了实现这种类型在其他情况下,您可以创建一个基类遵循的协议(protocol),并在您尝试确定一个对象是否是该类型的某个子类时尝试将对象转换为该类型。

考虑下面的例子

class Bitcoin { }

class Ethereum { }

class Wallet<T> {
var usdValue: Double = 0
}

class BitcoinWallet: Wallet<Bitcoin> {

}

class EthereumWallet: Wallet<Ethereum> {

}

let bitcoinWallet = BitcoinWallet() as Any

if let wallet = bitcoinWallet as? Wallet {
print(wallet.usdValue)
}

由于您所指的相同错误,这将不起作用:

error: generic parameter 'T' could not be inferred in cast to 'Wallet<_>'

但是,如果你添加下面的协议(protocol)

protocol WalletType {
var usdValue: Double { get set }
}

并使 Wallet 符合这一点

class Wallet<T>: WalletType

然后您可以将值转换为该协议(protocol)并按预期使用它:

if let wallet = bitcoinWallet as? WalletType {
print(wallet.usdValue)
}

关于swift - 是否有一些解决方法可以在不知道定义的元素类型是什么的情况下转换为通用基类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39943500/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com