Swift 为什么可以';斯威夫特不能推断这里的类型吗?
我有一个Swift 为什么可以';斯威夫特不能推断这里的类型吗?,swift,Swift,我有一个关联类型的代码: protocol ATState { associatedtype Event func nextState(event:Event) -> Self? } enum ATPlayerState:ATState { case weak, powerful, poweringUp, poweringDown func nextState(event: String) -> ATPlayerState? {
关联类型的代码
:
protocol ATState {
associatedtype Event
func nextState(event:Event) -> Self?
}
enum ATPlayerState:ATState {
case weak, powerful, poweringUp, poweringDown
func nextState(event: String) -> ATPlayerState? {
return nil
}
}
但是有一个编译时错误:“ATPlayerState不符合协议ATState”;添加typealias Event=
,有一个修复程序,如果我添加:typealias Event=String
,它修复了错误。但是我不明白为什么我需要这样做
当我阅读时,我看到:
由于Swift的类型推断,您实际上不需要声明
Int的具体ItemType作为IntStack定义的一部分
此外,这些示例不使用类型别名,它们只是实现了这些方法
那么,这里不应该推断关联的类型吗
谢谢大家! 将事件添加为typealias时,编译器是否不会给出错误?这个代码块工作得很好
enum ATPlayerState:ATState {
case weak, powerful, poweringUp, poweringDown
typealias Event = String
internal func nextState(event: String) -> ATPlayerState? {
return .powerful
}
}
当您将事件添加为typealias时,编译器不会给出错误?这个代码块工作得很好
enum ATPlayerState:ATState {
case weak, powerful, poweringUp, poweringDown
typealias Event = String
internal func nextState(event: String) -> ATPlayerState? {
return .powerful
}
}
正如我在问题中所解释的,我知道添加类型别名可以解决问题。我的问题是为什么我需要这样做,因为在苹果的例子中(你可以在我的问题链接中看到),它似乎是推断出来的!Apple示例使用了您首先看到的
typealias ItemType=Int
。其次,在使用协议时,您应该只验证您的类型。您只是在使用associatedtype
关键字时给出了承诺。在他们使用它的示例中,我忽略了这一点,但正如他们所解释的,这是不需要的。这实际上是Swift编译器的一个bug!(正如@Hamish在我的问题下解释的那样)。正如我在问题中解释的那样,我确实知道添加类型别名可以解决问题。我的问题是为什么我需要这样做,因为在苹果的例子中(你可以在我的问题链接中看到),它似乎是推断出来的!Apple示例使用了您首先看到的typealias ItemType=Int
。其次,在使用协议时,您应该只验证您的类型。您只是在使用associatedtype
关键字时给出了承诺。在他们使用它的示例中,我忽略了这一点,但正如他们所解释的,这是不需要的。这实际上是Swift编译器的一个bug!(正如@Hamish在我的问题下解释的那样)。这是一个已知的bug,Self
return就是罪魁祸首–请参阅。只需将typealias
添加到一致性类型以显式满足关联类型看起来是最简单的解决方法。@Hamish噢,谢谢!我以为我误解了什么。。。希望它能很快修好!!这是一个已知的bug,Self
返回就是罪魁祸首–请参阅。只需将typealias
添加到一致性类型以显式满足关联类型看起来是最简单的解决方法。@Hamish噢,谢谢!我以为我误解了什么。。。希望它能很快修好!!