快速重写init(格式:字符串,_参数:CVarArg…)

问题描述 投票:0回答:1

我正在尝试重写在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: &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: &copy, replacement: String(replacementInt))
            default:
                self = format
            }
        }
    self = copy
}

但是,当应用String(replacementInt)时出现以下错误

协议类型'LosslessStringConvertible'不符合'LosslessStringConvertible',因为只有具体类型才能符合协议

奖金

如果我可以在不导入任何库的情况下执行此操作,而只是使用swift进行编写,那么将是一个好处。

我正在尝试重写在Foundation中找到的标准String(format,arguments)方法,该方法接受一个字符串,并将所有包含%i的值替换为ints,将%@替换为字符串和整个范围...]]

swift switch-statement protocols control-flow
1个回答
0
投票

您可以符合LosslessStringConvertible作为自变量的要求:

init<S: LosslessStringConvertible>(format: String, _ arguments: [S])
© www.soinside.com 2019 - 2024. All rights reserved.