String
具有以下初始值设定项(在众多中):
init(count: Int, repeatedValue: Character)
init(count: Int, repeatedValue: UnicodeScalar)
所以不应该做以下工作吗?
let str = String(count:8, repeatedValue:"*") // Error: "Extra argument 'count' in call"
编译器是否应该能够推断出类型?!即使双引号 严格用于字符串文字,Character
和UnicodeScalar
也符合UnicodeScalarLiteralConvertible
协议。那么这里发生了什么?
当然,我总是可以repeatedValue:("*" as Character)
,但那么推断出类型的重点是什么?!
答案 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)