2016-03-22 8 views
15

問題に正しく推測することはできません。タイプは、迅速2.2

import Foundation 

func whatAmI<T>(inout property:T?) 
{ 
    switch property { 
    case is Int?: 
     print("I am an Int?") 
    case is String?: 
     print("I am a String?") 
    default: 
     print("I don't know what I am") 
    } 
} 

var string : String? 
whatAmI(&string) 

迅速2.2とXcodeの7.3の下に次のコードを実行し、コンパイラが正しくオプションの種類を推測することができませんXcodeの7.3での私の側に

これは、私は関数に渡す前に、空の文字列と変数を初期化する場合、スイッチはそれがあることを推定し、しかしI am an Int?

を印刷します文字列?

これは、以前のXcodeバージョンでI am a String?と表示されます。

同様の結果が得られますか?

観察:

この関数シグネチャを使用する場合に同じことが起こる:

func whatAmI(property:AnyObject?) 

- バグ -

は、この問題は、SWIFT 2.2の回帰である: https://bugs.swift.org/browse/SR-1024

+1

これは実際にはバグかもしれません。私は 'T'が' String'と推論され、 'Til'は' Int? 'であると見なされますが、'(StringとしてのnilはInt) 'は失敗します。 – Sulthan

+0

Strange:これはSwift 2.1.1で動作します。つまり、プログラムは '私は文字列ですか? ' – tom

+1

バグレポートを提出することをお勧めします。本当に素敵です。 – matt

答えて

3

これはバグのようです。最小の例は次のとおりです:

func genericMethod<T>(property: T?) { 
    print(T) // String 

    let stringNil = Optional<String>.None 

    print(stringNil is String?) // true (warning - always true)  
    print(stringNil is T?) // true 

    let intNil = Optional<Int>.None 

    print(intNil is String?) // false (warning - always fails) 
    print(intNil is T?) // true - BUG 
} 

genericMethod("") 
+0

コードサンプルをバグレポートに追加しました。 – svrs