2017-07-07 34 views
1

我是新來的斯威夫特。我發現了標匹配的一些怪異的行爲:如何在Swift 3.1中使用字符下標?

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文字和Character文字, ,缺省值爲String(如果兩者都在上下文中有效)。隨着

test["" as Character] // Character: 

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

你得到預期的結果。

+0

那麼在Swift中是否有類型優先級? –

+0

@RoboRobok:文字有一個默認類型。 '123'可以是'Int'或'Float'或'Double'或'UInt64'或...。如果沒有其他內容可以從上下文中推斷出來,它將被視爲「Int」。 –

+0

我愛Swift越來越多:) –

相關問題