[Mac] Swiftで関数名や行番号などを出力する

次のデバッグ用のリテラルを用いると、ファイル名や関数名などデバッグに役立つ情報を出力することが出来ます。

swift2までは、

print(“__FILE__ = \(__FILE__)”)
print(“__LINE__ = \(__LINE__)”)
print(“__COLUMN__ = \(__COLUMN__)”)
print(“__FUNCTION__ = \(__FUNCTION__)”)

上記のリテラルを使用できましたが、これらはswift3では廃止される予定らしく、実行すると

__FILE__ is deprecated and will be removed in Swift 3, please use #file
__LINE__ is deprecated and will be removed in Swift 3, please use #line
__COLUMN__ is deprecated and will be removed in Swift 3, please use #column
__FUNCTION__ is deprecated and will be removed in Swift 3, please use #function

このような警告が表示されます。そのため、今後は以下のリテラルを使用する必要があります。

print(“#file = \(#file)”)
print(“#line = \(#line)”)
print(“#column = \(#column)”)
print(“#function = \(#function)”)
  • #file : ソースファイルのファイルパス
  • #line : ファイル中の行番号
  • #column : 列番号(行の中で何文字目か)
  • #function : 関数名

[Mac] Swiftのリテラルについて

Swiftには次のようなリテラルがあります。

  • 数値
// 整数(10進数)
15

// 負の整数(10進数)
-15

// 2進数(10進数で15)
0b1111

// 8進数(10進数で15)
-0o17

// 16進数(10進数15)
0x0f

  • 数値の指数表記
// 10の累乗を表記する場合は「e」を使います。
// 15*10の3乗
15e3

// 2の累乗を表記する場合は「p」を使います。
// 0x0f(10進数の15)*2の3乗
0x0fp3

// 10進数に対して「p」を使うとエラーになります。
// 15p3
// Expected a digit after integer literal prefix

  • Boolean
true

false

  • 文字
// Character型にすることで、
// アルファベットでも日本語でも格納可能です。
let char1:Character = “a”
let char2:Character = “あ”

// ただし、文字なので2文字以上は格納できません。
// let char3:Character = “aあ”
// Cannot convert value of type ‘String’ to specified type ‘Character’

  • 文字列
// String型にすることで、複数の文字が格納可能です。
let str1:String = “123abc”
let str2:String = “123あいう”

  • 配列
// [要素1, 要素2, 要素3, …]のように「,」で区切って表記します。
let ary1:[Int] = [1,2,3]
let ary2:[String] = [“123”, “abc”, “あいう”]

  • 辞書
// [キー1:値1, キー2:値2, キー3:値3, …]のように、「キー:値」の組み合わせを「,」で区切って表記します。
let dic1:[String:Int] = [“abc”:1, “あいう”:2]
let dic2:[Int:String] = [1:”abc”, 2:”あいう”]

[Mac][Swift] print関数、NSLog関数の出力先を変更する

通常、print関数は標準出力に、NSLog関数やCFShow関数は標準エラー出力に文字列を出力します。

freopen関数を使って次のようにすると、これらの出力先をファイルに変更することができます。

import Foundation

print(“print function 1”)
NSLog(“NSLog function 1”)

var stdout_file = NSString(string: “~/Desktop/stdout.txt”).stringByExpandingTildeInPath
var stderr_file = NSString(string: “~/Desktop/stderr.txt”).stringByExpandingTildeInPath

_ = freopen(stdout_file, “w”, stdout)
_ = freopen(stderr_file, “w”, stderr)

print(“print function 2”)
NSLog(“NSLog function 2”)

この例では、print関数の出力先を~/Desktop/stdout.txtに、NSLog関数の出力先を~/Desktop/stderr.txtに変更しています。