SSブログ

Swiftのサンプルコードがさっぱり動かない(NSOpenPanel) [プログラミング]

動かないどころか、コンパイルさえ通らない。最終的には動かしたんだが…。

Swift自体とライブラリ変えすぎなんじゃない?
半年前のサンプルソースが動かないとかどうかしてるよ。アップルらしいといえばApple純正ソフトらしいけどw。


Swiftの文法に近づけようとしすぎて、CocoaとかのObjective-Cの関数などの名前からも乖離している。ちょっと頭がおかしいのではないか。

Xcodeも勝手にコンパイルしてくれるので、ガタガタして落ち着かない。すごく気持ち悪い。Obj-Cでもここまでおかしくなかったぞ。そもそもの文法が分かっていないのも問題だけど、その程度は大体はサンプルソースを見ながらだったら普通はいける。コンパイラのエラーで大体わかる。だけど何が悪いか見当がつかない。

Obj-Cではdeprecatedなものでも動いてくれはするが、Swiftではもはやコンパイルすら通してくれない。静的言語としてはこれくらいで当然なのかもしれないけど、Obj-Cよりはサクサク書けるものだと思っていた。ちょっとこれはひどくないか。他の言語を渡り歩いてきたけど、Webのサンプルソースさえ少しの手直しで動かない言語ってなかなかないぞ。

NSOpenPanel.begin(completionHandler:)
がやっと動いた。ほぼスケルトン状態にしてやっと文法的に正しくなった。
もともと、どこかから奪ってきたソースがbeginWithCompletionHandler()だったから、ちょっと変えるだけだったけど、何でこんなにも問題が起こるのかわからないくらい他のところでエラーが出て今はコメントアウトしている。


問題はXcode8でSwift3に変わっているらしいこと。
 https://developer.apple.com/swift/blog/?id=36
具体的な内容は
 http://artteknika.hatenablog.com/entry/2016/11/01/192942

「Swift側の標準ライブラリ(?)に即したような形で、ライブラリの変更が行われている」+「文法の変更、又は廃止」。廃止されると全く通らなくなるので困るね。というか、よく考えられた言語だと、バージョン間の変更も穏やかなんだけど、クソみたいにみんなが集まってきちゃうと、Python2.6, 2.7, 3系統みたいな状態になってしまうってことだろう。賢い人ばかりだといいけど、そうじゃないのが世の常。


とりあえず何もできないけど、ディレクトリ選択ダイアログだけは出るぜな状態。Swiftの文法何もわかってやしない感じw。これからこれから♪ 少なくともObjective-Cの機能は別の書き方で残っているはずだ。
	let openPanel = NSOpenPanel()
	openPanel.canChooseDirectories = true // ディレクトリを選択
	openPanel.canCreateDirectories = false // ディレクトリを作成できない
	openPanel.canChooseFiles = false // ファイルを選択できない
	
	openPanel.begin(completionHandler: { (num) -> Void in
		if num == NSModalResponseOK {
			NSLog("Open")
		} else if num == NSModalResponseCancel {
			NSLog("Canceled")
		}
	})

もしかするとXcode9ぐらいには動かなくなってるかもねw。でも、一応8.2で動くはず。というか動いている。



よし、最後までやってディレクトリを取ってみましょうか。NSLogにパス吐き出すだけですけど。NSURL関係も変わってしまっているらしいな。あぁ面倒くさぁ。

	openPanel.begin(completionHandler: { (num) -> Void in
		if num == NSModalResponseOK {
			for fileURL in openPanel.urls {
				let filePath :String! = fileURL.path
//					let decoadedPath :String! = filePath.stringByRemovingPercentEncoding  // 日本語ファイルの場合
				NSLog(filePath)
			}
		} else if num == NSModalResponseCancel {
			NSLog("Canceled")
		}
	})

元々のソースには日本語パスのデコードがあったのだけれど、最近はUTF-8とかで管理されているだろうから気にする必要がなさそうな気がするんだけどね。ともあれ、システムの日本語表示されるディレクトリは英語の代替文字があったりする。というか、日本語の方が代替文字なんでしょう。「デスクトップ」とか。

あと複数ファイルを選択してないから、for inで回す必要はないのかな。あとファイルパスはletにする必要があるのだろうか。普通に考えるとvarとかだよな。いまいちSwiftの常識がわかってない。


とりあえず、エラーの傾向はわかった。変数が使われない時はワーニングを吐く。これは最近のコンパイラの常識なのかな。昔はモノによって出たり出なかったりしてたけど。あとdeprecatedな関数はコンパイルエラーが出て、代替関数が提示されるので変えるしかなさそう。

Obj-Cとかやたら古いdeprecatedな関数でも使えたりするんだけど、そういう保証しませんという立場から、放棄するから使えませんに変わっていくのかな。まぁ変な挙動がなくなるのはいいかもしれないけど、環境を変えるごとにコンパイルエラーとかを吐かれたんじゃたまったものではない。まだワーニング程度ならまだしも。それもApple側のつまらない細かい変更に対応しろということなんだろうな。どんどんAppleの開発者のエゴが反映されていく。そんなの一般的な開発者の方は望んじゃいないんだよ。Obj-Cのライブラリの運営が今よりまともだったのは、NeXT社のエンジニアが入っていたからじゃないかなと思わせる。

ともあれ、基本的にシステムに近いAPIはdeprecatedにすべきものではないという事はMicrosoftの技術者でさえ少しはわかっている。まだライブラリのバージョンというか名称を変えてしまうぐらいのものだとしたら別に仕方ないと思うけれどそうじゃないもんなぁ。Xcodeを初期から見ているものとしては暗雲立ち込めているとしか見えないんだがw。まぁSwiftのライブラリと言語仕様が固まるまで待つしかないのかもしれない。


よく「もうObj-Cなんて古いからSwiftでしょ」なんて文句を聞くんだけど、この状況を見るとObj-C + ARCを使っている方がずっとマシなような気がする。少なくとも長期間アプリに手を入れていくことを考えるとSwiftは最適な解では決してない。そのところをわかっている人はSwiftを諸手を挙げて賞賛するわけがない。

だけど、Swift自体が悪い言語というわけではなく、単にAppleのライブラリ作成のお行儀が悪いだけ、Xcodeが無遠慮なだけという話だ。だから晴れてOSSになって、AppleごとSwiftが沈没する危険は回避されたという喜ばしい状況にはなってはいるのだから、暗いだけの話ではないのだろう。

タグ:Swift3
コメント(1) 
共通テーマ:パソコン・インターネット

コメント 1

miff

https://developer.apple.com/reference/appkit/nssavepanel/1527007-begin

見てもよくわかんねーな
by miff (2017-02-11 04:20)