すっかり忘れていたけど、Xcode上でSwiftのコードを簡単に実行できるPlayground環境もサンドボックス化していたのだった。

あるフォーマットのファイルを読み込んで要素分解する必要があり、ビルドしてテストするのも大変だから簡単にPlaygroundで実行しながらコードを書こうとしてその最初につまずきました。

なぜか、Xcodeが "Running プロジェクト名 ... " と出力をしたままブロックされて戻ってこなくなりました。エラー出力もなし。以前からそういうことがあった場合にはXcodeを再起動すれば直っていたので、それかと思い再起動。それでも直らないのでOSを再起動。それでも同じ。

なんでかなあ?と思って色々やってようやく上記のことに気がつきました。


最初書いていたのは以下のようなもの

※以下コードはSwift2のコード。

let path = "/Users/me/tmp/...."
str = try String(contentsOfFile: path, encoding: NSUTF8StringEncoding)


他にも多くのテストコードが入っているコードテスト用のPlaygroundだったのでこの部分だと気がつくのに少し時間がかかった。もしかして try で throw される例外をキャッチしなければいけないの?と思い

let path = "/Users/me/tmp/...."
do {
    str = try String(contentsOfFile: path, encoding: NSUTF8StringEncoding)
} catch {
    print(error)
}


するとちゃんと最後まで実行して結果を出力。ちなみに出力したエラー文字列は以下

"Error Domain=NSCocoaErrorDomain Code=257
 "The file “foo.dat” couldn’t be opened because you don’t have permission to view it."
 UserInfo=0x7fdc11f2c2f0 {NSFilePath=/Users/me/tmp/....,
 NSUnderlyingError=0x7fdc11f00290 "The operation couldn’t be completed. Operation not permitted"}\n"

※改行はこちらで追加。

このエラーを読んでわかった次第。テストしたいファイルをPlaygroundにドラッグ&ドロップするとバンドルリソース内にコピーしてくれた。アクセス時には以下のようにしてURLを取得する。

var url = NSBundle.mainBundle().URLForResource("foo", withExtension: "dat")