我正在尝试重写在Foundation中找到的标准String(format,arguments)方法,该方法采用一个字符串,并将所有包含%i的值替换为ints,将%@替换为字符串和整个类型范围。 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) {
但是由于我希望此方法适用于所有值,因此我试图使用开关查找类型为Any的类型,该类型具有使用String(value)初始化程序转换为字符串所需的LosslessStringConvertible协议。
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)时出现以下错误
如果我可以在不导入任何库的情况下执行此操作,而只是使用swift进行编写,那么将是一个好处。协议类型'LosslessStringConvertible'不符合'LosslessStringConvertible',因为只有具体类型才能符合协议
奖金
我正在尝试重写在Foundation中找到的标准String(format,arguments)方法,该方法接受一个字符串,并将所有包含%i的值替换为ints,将%@替换为字符串和整个范围...]]
您可以符合LosslessStringConvertible
作为自变量的要求:
init<S: LosslessStringConvertible>(format: String, _ arguments: [S])