2017-07-07 63 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越来越多:) –

相关问题