2017-02-24 67 views
1

我有以下SWIFT 3码:SWIFT 3问题与CVarArg传递多次

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)如何解决这个问题?

回答

3

您无法将可变参数列表传递给另一个函数,您必须通过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 
+0

感谢@马丁。太棒了。 – user1452936