解放区在住氷翠メニュー

ファイルを開く。【Swift】

2018-04-02 19:08

LINEで送る

このページの環境は
Swift4をベースにしています。
また、開発環境はXcode9
MacosはHighSierra 10.13となります。

はい、今回はSwift4を使って、まずはファイルを開いてみようというものです。

正直、こんなに苦労するとは思ってもみなかった。

結果として、これが作ったものです。
上部にテキストフィールドがあります。ここにはフィアル名がフルパスで表示される予定。
下にテキストビューを設置して、その内容を表示してみようというものです。
まずはこういったファイルの読み込みができなければ、仕事上はきついものがあるのでw

「ViewController.swift」のファイルを開いて、「class ViewController」の中での作業。
まずは共通で使える変数を用意。といっても、ここでは上のフォームで使っているコンポーネントを変数化した上での話だ。
よって、

クラス名のある部分の直後に

この2つを宣言しておく。

ここはなんともわかりやすいことだ。

「@IBOutlet」はフォームと変数をつなげるものと考えよう。

そして、weakはわからないがw
weakの他に「strong」というのもあるようだが、未だにわからないw

「var」はjavascriptでも変数を宣言するものとして扱っているので、ここでも変数として宣言しているのだろう。つまりは変化のできるものだ。

そのあとの「tf」とか「tv」というのが変数名だ。その後ろの語句はコンポーネントの種類ということだろう。
あとはこの2つに対して、storyboardの中でもつなげて上げれば準備はOK。

「override func viewDidLoad()」という関数があるので、この中でプログラムを記述していく。この関数はフォームが表示されるときに実行される関数らしいので、ここにあるとおり、「override」=上書きする形で記述していく。

今回は、ダイアログを出して、ファイルを選択。そのファイルを開いて表示するという形をとる。
上記が全文であり、プログラムの全体だ。
最初の方はまずダイアログのパネルに関するインスタンス化とその設定。
ファイルを選択することができるか、複数のファイルを選択することができるか、そういった細かい設定が可能だ。
そして、if文のところで、「OK」ボタンが押された場合の処理。
さらに下のif文では「fileURL」にファイル名が入っている場合の処理。
swiftでは基本的に「URL」という形をとる。つまり、文字列とURLは別ものなんです。

たとえば、単純に、「/usr/test.txt」というフルパスのファイル名がありますが、このままでは単純な文字列でしかないのです。よって、この状態ではファイルを操作することができません。
では、URLにするとどう変化するのかというと、「file:///usr/test.txt」という感じで、頭に「file://」がつきます。これがURLなんです。
URLは頭にプロトコルを宣言する形になるので、コンピュータも判断しやすくなるのでしょうね。

「fileURL.absoluteString」はこのURLを単純な文字列として出力するものです。
「tf.stringValue = fileURL.absoluteString」の部分は「tf」という名のテキストフィールドに文字列を代入するということになるので、これで先に話したテキストフィールドにファイル名が出てきます。

次がメインの処理です。
よく見ると「do」で囲まれています。これはPHPでいうtry文のこと。後ろにはcatchもあります。
ではどこにtryがあるのだろうか?というと、「try String〜」があります。
で、Stringの中にファイルを読み取る機能がついているんですね。
しかもエンコードの指定もできる。

今回、エンコードはシフトJISなので、「String.Encoding.shiftJIS」を指定します。

「fileContent」という変数に内容が代入されたようです。
で、この変数の内容は変更することがないので、letでもって定数として扱います。

最後に、「tv.textStorage?.append(NSAttributedString(string: String(fileContent)))」この部分でテキストビューに出力しているわけです。
ちなみに、この「append」というのは追加という意味なので、すでにデータが入っているなら、その後ろに追加されるので注意が必要です。

SwiftはObjective-Cを簡単に扱うための言語だと思っていたのだけど、やはりできることが多いので、なかなか難しいものがあります。
C言語よりはまだマシ。
メモリの管理だとかも、現時点では気にしなくていいし、そこまで求めてはいない。
しかし、できることの幅がやはり広すぎるので、難しいですね。