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)
但是推断类型有什么意义呢?
好了,这里的问题(如@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)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句