Swift重写init(格式:String,_参数:CVarArg..)



我正在尝试重写在foundation中找到的标准String(format,arguments(方法,该方法接受一个字符串,并用int替换所有包含%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: &copy, replacement: String(replacementInt))
default:
self = format
}
}
self = copy
}
private static func handleInt(copy: inout String, replacement: String) {

但由于我希望这能适用于所有值,我正试图使用开关来寻找具有使用string(value(初始值设定项转换为字符串所需的LosslessStringConvertible协议的类型Any。

init(format: String, _ arguments: [Any]) {
var copy = format
for argument in arguments {
switch argument {
case let replacementInt as LosslessStringConvertible:
String.handleAnyValue(copy: &copy, replacement: String(replacementInt))
default:
self = format
}
}
self = copy
}

然而,在应用String(replacementInt(时,我得到了以下错误

协议类型"LosslessStringConvertible"不能符合"LosslessStringConvertible",因为只有混凝土类型才能符合协议

奖金如果我可以在不导入任何库的情况下完成这项工作,并且只使用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'

相关内容

  • 没有找到相关文章

最新更新