解放区在住氷翠 緑の閃光

LANに接続してみた【swift】

2018-01-30 20:40

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

ということで、LANに接続してみた。

フォームはこんな感じ。
今回の目的はLANの上にある特定のフォルダの中にあるファイルの一覧を取得して、テーブルビューで表示させるというもの。
これがどうしても必要となる。

こんな感じでフォームを作ってみた。

で、今までの知識で、ここまではなんとかなるだろう。

あとは問題はプログラムの方だ。

基本的に「ViewController.swift」の中で行う。


class ViewController: NSViewController, NSTableViewDataSource {

ここは前にテーブルビューをやったときに使った方法。
後ろの部分に「NSTableViewDataSource」を追加しておく。

次に、必要となるコンポーネントのデリゲートだ。単語の使い方も間違っているような気がするけど、まぁいい。

// テキストフィールドの定義
@IBOutlet weak var tf: NSTextField!
// テーブルビューの定義
@IBOutlet weak var tableView: NSTableView!

クラス宣言の直後にこれらを定義。
テキストフィールドとテーブルビューのアウトレットを定義しておくことでいつでも使える仕様だ。

更にこのあとに


// テーブル用の配列変数
var programs = [String]()

テーブルで使う配列変数の宣言です。
こうしておけば、空の変数を用意することができる。
これだけのことに結構時間がかかったw

あとは、ボタンをクリックした時の動作をユーザー関数として用意。

その中に入るプログラムが重要になってくる。


var a = ""
if tf.stringValue == "" {
    a = "接続するパス"
} else {
    a = tf.stringValue
}
print(a + "に接続します")
let manager: FileManager = FileManager.default
var list:[Any]? = nil
do {
    list = try manager.contentsOfDirectory(atPath: a)
} catch _ as NSError {
    list?.removeAll()
}
for path in list! {
    let a = path as! String programs.append(a)
    print(path as! NSString)
}
// テーブルの内容を更新する
tableView.reloadData()

上の方はテキストフィールドにて入力されたもの。
LANのパスを入力するところということで。
最終的に「a」という変数に入る。

さて、LANのパスに関してだが、基本的にURLという形になる。聞いたことがあるかと思うが、ネットで使っているあの形。Windowsのユーザーにはちょっと馴染みの薄いものかもしれないが、「c:¥」とかいっても、表現の仕方が違うだけで、URLである。
「file://〜」という形だ。ここが「http://」だとみんなも知っているURLの通常(?)の形だろうけど、この部分はプロトコルの種類を定義している部分で、いろんな指定方法がある。

初めてMacを触る人ならわからない。なので、ここは、「ターミナル」というアプリケーションがMacには標準で入っている。Windowsでいうところの「コマンドプロンプト」のようなものだ。その「ターミナル」を起動して、ファイルをドラッグすると、パスが表示される。その先頭に先程の「file://」をくっつけると完成だ。

次にファイルシステムを利用するため、「FileManager」を使います。
「let manager: FileManager = FileManager.default」この部分で、定数として宣言していきます。

「var list:[Any]? = nil」listという配列変数を初期化していますが、初期値としてPHPでいうところの「null」を代入しています。
これ以降がtry文です。
ちょっと変わった形だなと思う氷翠ですが、swiftではこんな形なのでしょう。

で、このlistという配列変数に対して、ファイルの一覧を代入しています。
それが「list = try manager.contentsOfDirectory(atPath: a)」という部分になります。
これだけで一気に一覧が配列として代入されたことになるので、ありがたい関数ですw

for文。
初めて使いますが、PHPでいうところの「foreach」に近い形です。
たぶん、いつもどおりの使い方もできるのでしょうけど。
このfor文によって、「programs」というテーブルビューのために準備した配列変数にどんどん値を追加していくという感じです。

そして、最後。

「tableView.reloadData()」

これでテーブルビューの内容を再描画しています。

これでボタンというトリガーでもって、テーブルビューを更新する方法がわかりました。
さらに、今回は配列変数の初期化方法、for文、ファイルシステムの関数、LANのパスの指定方法というのもこのページの中には記載していませんが、使えることがわかりました。

また、macの場合、まず、マウントした状態にしないと、接続することができないということ。
上記の場合、マウントしないままボタンをクリックすると、エラーで止まりますw
その場合のエラー処理も行っておく必要があります。