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

时间:2015-01-10 02:00:06

标签: swift type-inference

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),但那么推断出类型的重点是什么?!

1 个答案:

答案 0 :(得分: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)