質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%

Q&A

解決済

1回答

263閲覧

SwiftUIのFileManagerクラスの使い方

hinarin96

総合スコア1

0グッド

0クリップ

投稿2024/07/16 02:32

テーマ、知りたいこと

私はSwiftUI初学者です。参考書に下記のようなファイルを保存するURLを作る関数のコードがありました。分からない箇所がありましたので御教示いただければ幸いです。

<知りたいこと>

  1. 02行目の操作は、ネットで調べるとFileManager.defaultを使ってデフォルトのFileManagerインスタンスを取得していると解説されています。FileManagerはクラスであるとされています。default とはなんでしょうか。

  2. 05行目でDocumentsフォルダのURLを docsUrl に fileManager.url(for:, in:)で入力しています。他の資料を調べますと url ではなく urls と書いてあるコードが多いです。どちらが正しいのでしょうか。

  3. また、fileManager = FileManager.defaultという操作をしないで、直接

let docsurl = FileManager.default.urls(for: in: )
と記述してあるコードも多いのですが、どのような違いがあるのでしょうか。

以上、よろしくお願いいたします。

背景、状況

import SwiftUI
import Foundation

00 // 保存ファイルへのURLを作る
01 func docURL(_ fileName:String) -> URL? {
02 let fileManager = FileManager.default
03 do {
04 // Docmentsフォルダ
05 let docsUrl = try fileManager.url(
for: .documentDirectory,
in: .userDomainMask)
06 // URLを作る
07 let url = docsUrl.appendingPathComponent(fileName)
08 return url
09 } catch {
10 return nil
11 }
12 }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

1について

Type Property
default
This method always represents the same file manager object. If you plan to use a delegate with the file manager to receive notifications about the completion of file-based operations, you should create a new instance of FileManager (using the init method) rather than using the shared object.
(機械翻訳)このメソッドは常に同じファイル・マネージャ・オブジェクトを表します。ファイル・マネージャーでデリゲートを使用して、ファイル・ベースの操作の完了に関する通知を受け取ることを計画している場合は、共有オブジェクトを使用するのではなく、(init メソッドを使用して)FileManager の新しいインスタンスを作成する必要があります。

default | Apple Developer Documentation

defaultはFileManagerクラスのプロパティのようですね。
普通はクラスはFileManager(~~~)のようにイニシャライザを呼び出してインスタンスを生成するのですが、FileManager.defaultのようにあらかじめ共通で使えるように生成されたインスタンスを使用できるような仕組み(プロパティ)を用意していることもあるみたいですね。
*「シングルトン」みたいな感じですかね。

2について

url(for:in:appropriateFor:create:) | Apple Developer Documentation
urls(for:in:) | Apple Developer Documentation

どちらが正しいとかではなく、用途によって使い分ける感じかなと思いました。
.url(~~~)は1つのURL型を返してくれるみたいです。
.urls(~~~)はURL型の配列を返してくれるみたいです。
扱おうとしているディレクトリ?が1つだけというのがわかっている前提でしたら.urlで良いのかなと思います。
そうじゃないなら.urlsかなと思います。
*詳細は上の公式ドキュメントを読むのが良いかなと思います。

3について

結果的にはどちらも違いはないかなと思います。
後から見た時にわかりやすい方で記述すると良いかなと思います。
あまり.で繋げすぎると何をしているのかわからなくなってきますので、適切な単位で変数に分かりやすい名前をつけて保持すると良いかなと思います。

投稿2024/07/16 04:19

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hinarin96

2024/07/18 00:01

回答ありがとうございます。「構造体」は日本語なのでどのようなものかなんとなくわかりますが、「クラス」は直感的に分かりにくいので初心者にはハードルとなるかと思いました。「インスタンス」も分かりにくいです。身近に質問できる人がいないので、大変助かりました。どうもありがとうございました。
退会済みユーザー

退会済みユーザー

2024/07/18 03:54

コメントありがとうございます。 「クラス」や「インスタンス」で引っかかっているのですね。 確かに私自身慣れてくると雰囲気で扱っている感じもありますね。 初めて勉強した時の説明もわからなかった記憶もありますし・・ 実際ある程度慣れてから説明しようと思ってもやっぱり説明するのが難しいのもわかりますね・・ > オブジェクト指向プログラミングにおけるクラス(英: class)[注釈 1]は、オブジェクトを生成するための設計図あるいはひな形に相当するものである。 > 抽象データ型の一つ。 > クラスから生成したオブジェクトの実体のことをインスタンスという。 > > [クラス (コンピュータ) - Wikipedia](https://ja.wikipedia.org/wiki/クラス_(コンピュータ)) 「クラス」や「インスタンス」の説明は大体引用したようなものですが、最初はやっぱりわからないものだと思います・・ 一気に理解しようとしてもわからなくて嫌になってしまうかもしれませんので、ほどほどにして、色々見てみる・経験してみるのも良いかなと思います。 また何かありましたら質問してみてくださいね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問