2016-12-12 7 views
0

型が明示的に宣言されているか推測されているかに基づいて、以下のコードは異なる出力を与えます。型宣言に基づくプロトコル実装の動作の違い

  1. なぜこのように動作しますか?なぜ型を宣言すれば、私のクラスにmyFloatを実装できないのですか?
  2. 型を明示的に宣言したいが、testClass1.myFloat()の呼び出しが2.7を返すように、拡張の実装をオーバーライドするにはどうすればよいですか? Xcodeの8.1で

この、スウィフト2.3

import UIKit 

protocol TestSource { 
    func myFloat() -> Float 
} 

extension TestSource { 
    func myFloat() -> Float { 
    return 2.5 
    } 
} 

protocol TestProtocol: TestSource { 

} 

class DevClass: TestProtocol { 

} 

class TestClass: DevClass { 
    func myFloat() -> Float { 
    return 2.7 
    } 
} 



let testClass1: TestProtocol = TestClass() 
testClass1.myFloat() // Returns 2.5 

let testClass2 = TestClass() 
testClass2.myFloat() // Returns 2.7 
+0

あなたは明示的に 'myFloat'は2.5を返します' TestProtocol'、などのタイプを宣言した。ここで

はさらに深く潜るブログ記事です。型を 'TestClass'として明示的に宣言すると、2.7が得られます。コンストラクタのクラス以外の型として宣言する全体のポイントは、クラスのスーパークラスまたはプロトコルに属する動作を取得することです。 – BallpointBen

+0

これはコンパイラのバグです。私はここで非常によく似た質問をしています。 – Cristik

答えて

0

これはバグではありません。簡単な答えは、プロトコル拡張が動的ディスパッチを導入しないことです。詳細については、this answerを参照してください。説明は非常に徹底的で、例を含んでいます。 https://nomothetis.svbtle.com/the-ghost-of-swift-bugs-future

+0

答えを指摘してくれてありがとう。両方の場所でupvotedと重複としてこの質問をマーク。 – Kedar

関連する問題