StringにはFoundation内のextensionでイニシャライザに、init(format: String, arguments: [CVarArgType])
が定義されていますが、init(format: String, _ arguments: CVarArgType...)
と同様に、argumentsの配列数が書式指定子数を下回った場合クラッシュします。
String(format: "%@ + %@ = %@", arguments: [
"1", "2", "3"
]) // => 1 + 2 = 3
String(format: "%@ + %@ = %@", arguments: [
"1", "2", "3", "4", "5"
]) // => 1 + 2 = 3
String(format: "%@ + %@ = %@", arguments: [
"1"
]) // EXC_BAD_INSTRUCTION
バグの早期発見につながって有り難いことかもですが、クラッシュするのはやり過ぎな場面(APNSの、(loc-)key
と(loc-)args
からクライアント側で文字列を作る場合など)もあるかと思います。
回避方法
NSStringのお力をちょっとだけお借りする方法しか思いつきませんでした。
let arguments = [
"1"
] as [CVarArgType]
NSString(format: "%@ + %@ = %@", arguments: getVaList(arguments)) as String // => 1 + (null) = (null)
他にいい方法がありましたら教えて下さいm(_ _)m