2016-10-23 10 views
1

私はassociatedtypeと、このコードがあります。スウィフト推論のタイプはここでどうしてですか?

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 = <Type>を追加する修正があります:typealias Event = String、それはエラーを修正します。しかし、私は理解していないなぜ私はこれを行う必要があります!

私はthe documentationを読んだとき、私がいることがわかり:スウィフトの型推論のおかげで、あなたが実際にIntStackの定義の一部としてのIntの 具体的なitemTypeに宣言する必要はありません

また、例ではエイリアスは使用されず、メソッドを実装するだけです。

ここで関連タイプを推論するべきではありませんか?

ありがとうございました!

+0

これは既知のバグです、 'Self'リターンがculpretです - [SR-2746](https://bugs.swift.org/browse/SR-2746)を参照してください。単に対応する型に 'typealias'を追加するだけで、関連する型を明示的に満たすことができるのは最も簡単な回避策です。 – Hamish

+0

@ハミッシュああありがとう!私は何かを誤解していたと思った...すぐに修正されることを願っている!! –

答えて

0

イベントをタイプアリアスとして追加すると、コンパイラはエラーを表示しませんか?このコードブロックはうまく動作します。

enum ATPlayerState:ATState { 

    case weak, powerful, poweringUp, poweringDown 

    typealias Event = String 

    internal func nextState(event: String) -> ATPlayerState? { 
     return .powerful 
    } 

} 
+0

私の質問で説明したように、タイプエイリアスを追加すると問題が解決されることがわかります。私の質問は、アップルの例(あなたが私の質問のリンクで見ることができる)が推論されているようだから、なぜそれをする必要があるのか​​ということです! –

+0

Appleの例では、最初に見たように 'typealias ItemType = Int'を使用しています。第二に、あなたはプロトコルを使用している間あなたのタイプを誇示する必要があります。あなたは 'associatedtype'キーワードを使って約束しています。 – ridvankucuk

+0

私はそれを使用している例でそれを見逃していましたが、彼らが説明するように、それは必要ではありません。実際にはSwiftコンパイラのバグです! (@Hamishが私の質問の下で説明したように)。 –

関連する問題