多次传递 CVarArg 的 swift 3 问题

标签 swift

我在 swift 3 中有以下代码:

 class StringUtility {

  static func Localizer(tableName: String?) -> (_ key: String, _ params: CVarArg...) -> String {
    return { (key: String, params: CVarArg...) in

      let content = NSLocalizedString(key, tableName: tableName, comment: "")

      if params.isEmpty {
        return content
      }

      print(params) ->>>>>> this prints [[[Wells Fargo]]]
      return NSString.init((format: content, arguments: getVaList(params))) as String
    }
  }
}

func localizationHelper(tableName: String, key: String, params: CVarArg...) -> String {
  let t = StringResourceUtility.Localizer(tableName: tableName)
  print(params) - >>>>>>>>>> this prints [[Wells Fargo]]
  return t(key, params)
}

如果您看到上面两个函数中的打印语句,每次在函数内部传递 CVarArg 时都会附加 [],从而导致输出错误的本地化字符串。

1) CVarArg 不能像上面的代码那样被多次传递? 2) 如何解决这个问题?

最佳答案

你不能将可变参数列表传递给另一个函数,你 必须改为传递 CVaListPointer。此外 withVaList 应该 代替 getVaList 使用:

class StringResourceUtility {

    static func Localizer(tableName: String?) -> (_ key: String, _ params: CVaListPointer) -> String {
        return { (key: String, params: CVaListPointer) in
            let content = NSLocalizedString(key, tableName: tableName, comment: "")
            return NSString(format: content, arguments: params) as String
        }
    }
}

func localizationHelper(tableName: String, key: String, params: CVarArg...) -> String {
    let t = StringResourceUtility.Localizer(tableName: tableName)
    return withVaList(params) { t(key, $0) } 
}

例子:

let s = localizationHelper(tableName: "table", key: "%@ %@", params: "Wells", "Fargo")
print(s) // Wells Fargo

关于多次传递 CVarArg 的 swift 3 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42428504/

相关文章:

macos - 如何设置 NSPathComponentCell 的 URL?

ios - 在后台线程 com.google.Maps.LabelingBehavior 上调用的 UI API

ios - 为什么 nsurlsession.datataskwithrequst 被取消

ios - Swift String Extension 替换第一个字符而不出现

ios - 在按钮单击 tableview swift 上更新 JSON 数据源

arrays - 填充了非 nil 值的数组(类)保持为空

swift - 我的恢复购买代码是否正确?如果正确,我应该在哪里执行更改用户默认值的操作?

swift - 将一个 TableViewController 转换为另一个时的 SIGABRT

ios - 在事件发生时从父级访问容器变量

objective-c - 我怎么不遵守这个协议(protocol)?