2017-07-07 4 views
1

私はSwiftを初めて利用しています。私は、添字マッチングのいくつかの奇妙な行動を見つけた:Swift 3.1でCharacter subscriptを使用するには?

struct SubscriptTest { 
    subscript(character: Character) -> String { 
     return "Character: \(character)" 
    } 

    subscript(string: String) -> String { 
     return "String: \(string)" 
    } 

    subscript(int: Int) -> String { 
     return "Int: \(int)" 
    } 
} 

let test = SubscriptTest() 
test["abc"] // String: abc 
test[13] // Int: 13 
test[""] // String: (surprisingly) 

私は最後のテストが私のCharacter添字、ないStringものと一致するだろうと思いました。最後に一致するものが使われているかもしれないと考えて、添え字宣言の順序を入れ替えようとしました。何も変わらなかったので、String添え字はまだ単一のCharacterのために使用されています。

私はちょうどStringサブスクリプトを使用して文字の数を確認することができます知っているが、私の質問の根源は好奇心です。

なぜCharacter添え字はここで決して一致しませんか?

答えて

1
""

は、(両方のコンテキストで有効である場合)StringリテラルとStringからCharacter 、リテラルとデフォルトの両方であることができます。

test["" as Character] // Character: 

または

let c: Character = "" 
test[c] // Character: 

を使用すると、期待どおりの結果を得ることができます。

+0

Swiftにはタイプ優先度のようなものがありますか? –

+0

@RoboRobok:リテラルのデフォルトの型があります。 '123'は' Int'や 'Float'や' Double'や 'UInt64'や...とすることができます。文脈から何も推測できない場合は 'Int'とみなされます。 –

+0

私はSwiftがますます大好きです:) –

関連する問題