Swiftの簡単なIOラッパーを記述しようとしています。
これをテストするために、プロジェクトルートに「Test.txt」という名前のファイルがあります。
この問題を抱えている他のすべての人から示唆されたように、Build Bundle Resources内のBuild Phasesにこのファイルを追加しました。
ファイルの内容を出力する目的で、1つの読み取り関数を持つ非常に単純なFileクラスを実装しました。
_class File2{
let resourceName: String
let type: String
let bundle = NSBundle.mainBundle()
init(resourceName: String, type: String = "txt"){
self.resourceName = resourceName
self.type = type
println(self.bundle)
}
func read(){
let path = self.bundle.pathForResource("Test.txt", ofType: "txt") //Hard coded these in just to make sure Strings contained no whitespace
println(path) //This returns nil...why?
var error:NSError?
//print(String(contentsOfFile:path!, encoding:NSUTF8StringEncoding, error: &error)!)
//return String(contentsOfFile:path!, encoding:NSUTF8StringEncoding, error: &error)!
}
}
_
バンドルのコンテンツを印刷すると、ファイルシステム上の特定の場所へのURIを取得します。これは、シミュレーター内のアプリの仮想の場所であると想定しています。それに移動すると、実際に「Test.txt」ファイルが含まれていることがわかります。
今私がしたいのは、そのファイルへのパスを取得することです。
これを行うには、self.bundle.pathForResource("Test.txt", ofType: "txt")
を呼び出します。
これは「nil」を返します
なぜ?:)
nameパラメーターに.txt
を含めないで、extensionパラメーターとして渡します。
ドキュメント から:
拡張子
検索するファイルのファイル名拡張子。
空の文字列またはnilを指定した場合、拡張子は存在しないものと見なされ、ファイルは名前と完全に一致する最初のファイルになります。
let bundle = Bundle.main
let path = bundle.path(forResource: "Test", ofType: "txt")
let bundle = NSBundle.mainBundle()
let path = self.bundle.pathForResource("Test", ofType: "txt")
NSBundle* bundle = [NSBundle mainBundle];
NSString* path = [bundle pathForResource:@"Test" ofType:@"txt"];
Swift 3.0、書き込み
let path = Bundle.main.path(forResource: "Test", ofType: "txt")
交換してください
let path = self.bundle.pathForResource("Test.txt", ofType: "txt")
と
let path = NSBundle.mainBundle().pathForResource("Test", ofType: "txt")
交換
let path = self.bundle.pathForResource("Test.txt", ofType: "txt")
と
let path = self.bundle.pathForResource("Test", ofType: "txt")
ユニットテストでリソースにアクセスしようとしている人のために、私はリソースがメインバンドルで見つからず、私の解決策はすべてのバンドルでパスを検索するという問題に直面しました、このように指定する必要はありませんバンドル識別子。ここで、fileName
は関数に渡される文字列であり、もちろん型は任意のものです。
NSString *path;
for (NSBundle *bundle in [NSBundle allBundles]) {
path = [bundle pathForResource:fileName ofType:@"json"];
if (path) {
break; // Here is your path.
}
}
NSBundle.mainBundle()。pathForResourceがnilを返すもう1つの理由は、ファイルがターゲットに適切に追加されていないことです。バンドル内のファイルをドラッグアンドドロップするときは、「ターゲットに追加」チェックボックスと「必要に応じてアイテムをコピー」チェックボックスが選択されていることを確認してください。
ofTypeパラメータはリソース名に追加されるため、次の行を置き換えます。
let path = self.bundle.pathForResource("Test.txt", ofType: "txt")
このようなものに:
let path = self.bundle.pathForResource("Test", ofType: "txt")
Build Bundle Resourcesも確認する必要があります。