formatting cadena con matriz de cadenas

Estoy tratando de crear una String con una matriz de String s, espero que esto funcione:

 let format = "%@ and %@!" let str1 = "bla" let str2 = "blob" private func formatItNicely(format: String, substrings: [String]) -> String { return String(format: format, arguments: substrings) } let result = formatItNicely(format, substrings: [str1, str2]) 

pero estoy recibiendo un fatal error: can't unsafeBitCast between types of different sizes .

He visto esto y esto y estas preguntas (y muchas más), pero todavía no sé cómo lograr lo que bash hacer.

String(format:, arguments: ) [CVarArgType] espera que [CVarArgType] sea ​​el segundo parámetro:

 let format = "%@ and %@!" let str1 = "bla" let str2 = "blob" private func formatItNicely(format: String, substrings: [CVarArgType]) -> String { return String(format: format, arguments: substrings) } let result = formatItNicely(format, substrings: [str1, str2]) print(result) // bla and blob! 

Pero tenga en count que esto puede bloquearse (o dar resultados inesperados) si los especificadores de formatting no coinciden con los arguments reales, las funciones de formateo no pueden (no pueden) comprobarlo.

Como no estás haciendo nada muy interesante, en realidad no necesitas la lógica de cadena de formatting incorporada. Puede hacer la sustitución usted mismo:

 func join(_ arr : [String], withFormatString s: String) -> String { var s = s for str in arr { if let r = s.range(of: "%@") { s.replaceSubrange(r, with: str) } } return s } let result = join([str1,str2], withFormatString:format) 

O puede usar la interpretación variada:

 private func formatItNicely(format: String, _ arguments: CVarArgType...) -> String { return String(format: format, arguments: arguments) } 

Llamándolo así:

 let format = "%@ and %@!" let str1 = "bla" let str2 = "blob" let result = formatItNicely(format, str1, str2)