Swift 参数类型未正确推断?

Swift parameter's type not properly inferred?

String 具有以下初始值设定项(其中有许多):

init(count: Int, repeatedValue: Character)
init(count: Int, repeatedValue: UnicodeScalar)

所以下面的方法不应该起作用吗?

let str = String(count:8, repeatedValue:"*")    // Error: "Extra argument 'count' in call"

编译器不应该能够推断出类型吗?!即使双引号 严格用于字符串文字,CharacterUnicodeScalar 都符合 UnicodeScalarLiteralConvertible协议。那么这里发生了什么?

当然我总是可以做到 repeatedValue:("*" as Character) 但是推断类型有什么意义呢?!

这里的问题(正如@Thilo 已经提到的)是协议一致性的歧义。

Character > ExtendedGraphemeClusterLiteralConvertible > UnicodeScalarLiteralConvertible
UnicodeScalar > UnicodeScalarLiteralConvertible

编译器会检查这些协议,但是当它遇到 UnicodeScalarLiteralConvertible 时,它不知道要选择哪个初始化程序。

您可以通过使用独特的初始值设定项扩展 String 来简化此操作:

extension String {
    init(count: Int, repeatedCharacter: Character) {
        self.init(count: count, repeatedValue: repeatedCharacter)
    }
}

let str1 = String(count: 8, repeatedCharacter: "*")
println(str1)

或(虽然我认为有点夸张)一个自定义运算符,它明确表示它是 Character:

postfix operator • {}
postfix func •(c: Character) -> Character { return c }

let str2 = String(count: 8, repeatedValue: "*"•)
println(str2)