gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 21:48:50 24 4
gpt4 key购买 nike

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 协议(protocol)。那么这里发生了什么?

当然,我总是可以执行 repeatedValue:("*"as Character) 但是推断类型有什么意义呢?!

最佳答案

这里的问题(正如@Thilo 已经提到的)是协议(protocol)一致性的模糊性。

Character > ExtendedGraphemeClusterLiteralConvertible > UnicodeScalarLiteralConvertible
UnicodeScalar > UnicodeScalarLiteralConvertible

编译器会检查这些协议(protocol),但是当它遇到 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)

关于没有正确推断出 Swift 参数的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27872097/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com