Swift 重写 init(格式:字符串,_参数:CVarArg...)
Swift rewriting init(format: String, _ arguments: CVarArg...)
我正在尝试重写 foundation 中的标准 String(format, arguments) 方法,该方法采用字符串并将包含 %i 的所有值替换为整数,将 %@ 替换为字符串和一系列类型。 https://developer.apple.com/documentation/swift/string/3126742-init
因为我不知道 c 我从
转换了初始值设定项
init(format: String, _ arguments: CVarArg) {
到
init(format: String, _ arguments: [Any]) {
现在我在字符串扩展中使用它来为 Ints 工作
init(format: String, _ arguments: [Any]) {
var copy = format
for argument in arguments {
switch argument {
case let replacementInt as Int:
String.handleInt(copy: ©, replacement: String(replacementInt))
default:
self = format
}
}
self = copy
}
private static func handleInt(copy: inout String, replacement: String) {
但是因为我希望它适用于所有值,所以我正在尝试使用开关来寻找具有 LosslessStringConvertible 协议的 Any 类型,该协议需要使用 String(value) 初始值设定项转换为字符串。
init(format: String, _ arguments: [Any]) {
var copy = format
for argument in arguments {
switch argument {
case let replacementInt as LosslessStringConvertible:
String.handleAnyValue(copy: ©, replacement: String(replacementInt))
default:
self = format
}
}
self = copy
}
但是,在应用 String(replacementInt)
时出现以下错误
Protocol type 'LosslessStringConvertible' cannot conform to
'LosslessStringConvertible' because only concrete types can conform to
protocols
奖金
如果我可以在不导入任何库并简单地使用 swift.
编写的情况下做到这一点,那将是一个好处。
您可以将符合 LosslessStringConvertible
作为参数的要求:
init<S: LosslessStringConvertible>(format: String, _ arguments: [S])
这将支持开箱即用的所有符合该协议的类型(并允许扩展其他类型以符合该协议):
var x: String = String(format: "%i %@", 5, "five")
print(x) // prints "5 five"
此解决方案的局限性在于,例如不符合 LosslessStringConvertible 的类型将导致错误。例如:
class Z {}
let z = Z()
var y: String = String(format: "%i %@ %@", 5, "five", z) // Compilation error: Argument type 'Z' does not conform to expected type 'CVarArg'
我正在尝试重写 foundation 中的标准 String(format, arguments) 方法,该方法采用字符串并将包含 %i 的所有值替换为整数,将 %@ 替换为字符串和一系列类型。 https://developer.apple.com/documentation/swift/string/3126742-init
因为我不知道 c 我从
转换了初始值设定项init(format: String, _ arguments: CVarArg) {
到
init(format: String, _ arguments: [Any]) {
现在我在字符串扩展中使用它来为 Ints 工作
init(format: String, _ arguments: [Any]) {
var copy = format
for argument in arguments {
switch argument {
case let replacementInt as Int:
String.handleInt(copy: ©, replacement: String(replacementInt))
default:
self = format
}
}
self = copy
}
private static func handleInt(copy: inout String, replacement: String) {
但是因为我希望它适用于所有值,所以我正在尝试使用开关来寻找具有 LosslessStringConvertible 协议的 Any 类型,该协议需要使用 String(value) 初始值设定项转换为字符串。
init(format: String, _ arguments: [Any]) {
var copy = format
for argument in arguments {
switch argument {
case let replacementInt as LosslessStringConvertible:
String.handleAnyValue(copy: ©, replacement: String(replacementInt))
default:
self = format
}
}
self = copy
}
但是,在应用 String(replacementInt)
时出现以下错误Protocol type 'LosslessStringConvertible' cannot conform to 'LosslessStringConvertible' because only concrete types can conform to protocols
奖金 如果我可以在不导入任何库并简单地使用 swift.
编写的情况下做到这一点,那将是一个好处。您可以将符合 LosslessStringConvertible
作为参数的要求:
init<S: LosslessStringConvertible>(format: String, _ arguments: [S])
这将支持开箱即用的所有符合该协议的类型(并允许扩展其他类型以符合该协议):
var x: String = String(format: "%i %@", 5, "five")
print(x) // prints "5 five"
此解决方案的局限性在于,例如不符合 LosslessStringConvertible 的类型将导致错误。例如:
class Z {}
let z = Z()
var y: String = String(format: "%i %@ %@", 5, "five", z) // Compilation error: Argument type 'Z' does not conform to expected type 'CVarArg'