ファイルにiOSプロジェクトにバイナリデータ(実行可能ではなく、画像ではなく、音声ではなく、生のバイナリデータ)を追加してアプリケーション内でData
またはuint8
配列にアクセスしますか?バイナリBLOB RAWデータファイルをiOSプロジェクトに追加してアクセスする
私は用語を検索しようとしました:埋め込みバイナリ(実行可能ファイルのみの回答を得ました)、埋め込みBLOB(しかし、SQLite BLOBについての回答のみが見つかりました)。
ファイルにiOSプロジェクトにバイナリデータ(実行可能ではなく、画像ではなく、音声ではなく、生のバイナリデータ)を追加してアプリケーション内でData
またはuint8
配列にアクセスしますか?バイナリBLOB RAWデータファイルをiOSプロジェクトに追加してアクセスする
私は用語を検索しようとしました:埋め込みバイナリ(実行可能ファイルのみの回答を得ました)、埋め込みBLOB(しかし、SQLite BLOBについての回答のみが見つかりました)。
は、フォルダにドラッグアンドドロップを使用するか、右クリックを使用してプロジェクトの構造(左のパネルの最初のタブ)にファイルを追加します - > "ファイルを追加する... "
ファイルは自動的にアプリケーションに埋め込まれます。あなたはプロジェクト設定(プロジェクト構造の最初の青いアイコンをクリックしてください)に行き、TARGETSの下であなたのアプリを選択し、 "Build Phases"タブに行きます。ここでは、「バンドルリソースのコピー」フェーズが表示されます。あなたのファイルがその一部であることを確認し、そうでない場合は+ボタンで追加してください。
あなたのアプリ内では、それは本当に簡単です。ファイル名がfoo.xyz
の場合、
func loadFile() -> Data?
{
guard let fileURL = Bundle.main.url(forResource: "foo", withExtension: "xyz") else {
print("Failed to create URL for file.")
return nil
}
do {
let data = try Data(contentsOf: fileURL)
return data
}
catch {
print("Error opening file: \(error)")
return nil
}
}
ファイルを追加することは簡単です - 追加するグループを右クリックしてAdd files to xxx
を選択し、ファイルを選択してください。アプリのターゲットが選択されていることを確認してください(デフォルトではおそらく)、そのバンドルに追加されます。
バイナリファイルも非常に単純であることへのアクセス:
guard
let url = Bundle.main.url(forResource: "Filename", withExtension: "bin")
let data = Data(contentsOf: url) else {
print("Well, that didn't work")
}
print("Look - data: \(data)")
ファイルが存在する必要があります。存在しない場合、アプリケーションは正しく構築されていません。つまり、呼び出し元に 'nil'を渡すのは意味がありません。*プログラミングエラーを隠すだけです。*(その場合はユーザーに何を表示しますか?*"データが見つかりませんでした。これは、force-unwrap/force-tryが許容される状況であり、プログラミングエラーを早期に発見するのに役立ちます。 –
@MartinR私は同意しますが、あなたが望む動作であれば、関数の結果をいつでも強制的にアンラップすることができます。コンソールにエラーが表示されるという利点があります。初心者は、ほとんどの時間を避けるべきであるときにすべてをアンラップする傾向があります。だから私は私の事例でこの行動を促さないようにしています。また私は個人的にアンラップを強制しません、私はデバッグ中にバグをちょうど捕まえるのを助けるコンソールでエラーを使用し、プロダクトにとって安全です(しかし、これは私のスタイルであり、必ずしもベストプラクティスではありません)。 – deadbeef
また、*私は奇妙な開発者だと言うメッセージ、私のアプリは正しく構築されていない*私の意見でクラッシュよりも優れているが、再び、それは私です:) – deadbeef