Swift で書式文字列を受け取る関数を作る

Swift プログラミング

Swift でも Objective-C 言語でおなじみの書式文字列を受け取って文字列を作る関数やメソッドを簡単に実装できるようになっています。


書式文字列といえば、たとえば "Item name at index %d is %@." のような文字列で、この "%d" や "%@" のところに、別の変数の値を展開して文字列を完成させる仕組みです。

この機能を自作の関数やメソッドの中で使いたいとき、Objective-C 言語では va_list などの関数を使って扱えるようになっていましたが、Swift 言語でも似た方法で簡単に扱えるようになっています。

Objective-C 言語で書式文字列を扱う方法は 可変長引数を使って書式文字列を展開する で紹介しています。

関数で書式文字列を受け取る

関数やメソッドで書式文字列を受け取るためには、次の引数が必要になります。

引数 目的
書式文字列 String 書式文字列そのものを表す引数がひとつ必要です。
書式文字列で使う値 CVarArgType... 書式文字列で使う値を受け取る引数を可変長引数で用意します。幾つの引数が必要かは書式文字列次第です。

これらを踏まえると、書式文字列を使って処理を行う関数を次のように定義できます。

func showLogMessage(format:String, _ arguments:CVarArgType...) -> String

最初の引数 format で書式文字列を受け取って、そこで使う値を argments で受け取り、最終的に文字列を返す関数を定義しています。

ここで、第二引数のラベル名で "_" を指定して省略するようにしていますが、こうすることで NSStringstringWithFormat:メソッド のような、書式文字列に続けて好きなだけ値をカンマ区切りで並べられるスタイルの記述ができるようになります。

ちなみに値がひとつも必要ない場合は、第一引数の書式文字列だけの指定で済ませられます。

書式文字列を展開する

このようにして受け取った書式文字列は NSStringstringWithFormat:arguments:メソッド を使って最終的な文字列に展開します。

このとき stringWithFormat:メソッド に渡す値のリストは getVaList関数 を使って取得できます。

func showLogMessage(format:String, _ arguments:CVarArgType...) -> String {
	
	let values = getVaList(arguments)
	let string = NSString(format: format, arguments: values) as String
	
	return string
}

これで、書式文字列に値を埋め込んだ文字列を生成することができました。