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噢,谢谢!我以为我误解了什么。。。希望它能很快修好!!