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"
编译器不应该能够推断出类型吗?!即使双引号 是 严格用于字符串文字,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)
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)