Swift参数类型没有正确推断?

4

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),但是这样有什么意义呢?!


2
也许正是因为这种模棱两可的情况吧?由于你的字符串字面量可以被转换以匹配任一方法,编译器应该选择哪一个呢? - Thilo
http://bugreport.apple.com - Lance
1个回答

0

嗯,这里的问题(正如@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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接