SSブログ

Swift3でNSOpenPanelをmodalで開く [プログラミング]

時間ねーので適当だが動くでしょう。前回はモードレスなダイアログだったので、いろいろ問題がある人はあるんでしょうから、今度はモーダル。

それにクロージャ(たぶん)の中に、処理をゴリゴリたくさん書いていくのも綺麗じゃないし、外出しするとなんかよくわかんねーエラーが出てたのでやめた。
Call to method 'なんとか' in closure requires explicit 'self.' to make capture semantics explicit
とか
Missing argument label 'file:なんとか' in call cloursure
とかな。めんどうくさいので。

以下前回。

http://miff.blog.so-net.ne.jp/2017-02-08-2

今回はAppleへの文句は垂れない予定。
以下サンプルソース。部分的だが許して。大体必要なものはあると思うし。

	let openPanel = NSOpenPanel()
	openPanel.canChooseDirectories = true	// ディレクトリを選択
	openPanel.canCreateDirectories = false	// ディレクトリを作成できない
	openPanel.canChooseFiles = false		// ファイルを選択できない
	
	let num = openPanel.runModal()
	if num == NSFileHandlingPanelOKButton{
		for fileURL in openPanel.urls {
			let filePath = fileURL.path
		}
		NSLog(filePath)
		
	}else if num == NSFileHandlingPanelCancelButton{
		NSLog("Canceled")
		return
	}

これでファイルパスは取れるでしょう。取れなかったらSo-netのアカウントとって下のコメントで聞いてくんな。わかんねーかもしれないけどな。




そんで欲しいディレクトリをほげほげしたいわけだが、
directoryHogehoge(filePath)

NSLog(filePath)
あたりに置くのだけれど、関数の宣言がちと気持ち悪い。どういう意味があるのかわからないのだけれど

func directoryHogehoge (_ path :String){
}

となぜかアンダーバーを置かないといけないみたいだ。なんだろう。ボタンとかをつなげて作ってくれる自動的にできるソースも
@IBAction internal func hogehoge(_ sender: Any)
みたいに_がついてる。

ここで登場

もっとスマートな音楽の埋め方はないのかw
IMG_4586.JPG
買っちゃいました。アマゾンは本は昔と同じ送料無料だったのね。
にしても地面がきたねーなおい。ブツ撮りは背景が綺麗じゃないと話にならないけどこの際気にしないw


この本のP.109に外部引数名と内部引数名があって、外部引数名を省略するときにアンダーバーを付ける、と。
func hoge(naibu1: Int, gaibu naibu2: Int)
ってこんな感じで。第一引数は外部も内部も兼用、かな。

呼ぶ時には
hoge(naibu1: 5, gaibu:6 )
みたいによく見かける key:value な感じの書き方になるようです。

ややこしいことに、二つ目の外部引数を付ける時は、一つ目の外部引数は省略可能。第一引数の省略を省略しないで書くと

func hoge(_ naibu1: Int, _ naibu2: Int)

と書けて
hoge(1, 2)
とできる。まぁ普通だよね。C言語っぽいよね。どうせなら第一引数も名前使った方が気持ちよかろうにと思うんだけど…。そこいらはObjective-Cに習ったんだろうか。互換性をつけるために。

下記のコードをPlayGroundとかで実行すると、まぁそうだよね、という無駄な「1+2=3」が計算できる。

//よくある第一外部引数省略バージョン
func hoge(naibu1: Int, gaibu naibu2: Int){
	print( "\(naibu1) + \(naibu2) = \(naibu1 + naibu2)" )
}

//両方とも省略して、C言語っぽい呼び方をできるバージョン
func hogehoge(_ naibu1: Int,  _ naibu2: Int){
	print( "\(naibu1) + \(naibu2) = \(naibu1 + naibu2)" )
}

//どうせなら第一引数から全部やった方が気持ちよかろうバージョン
func hogehogehoge(gaibu1 naibu1: Int, gaibu2 naibu2: Int){
	print( "\(naibu1) + \(naibu2) = \(naibu1 + naibu2)" )
}

hoge(naibu1:1, gaibu:2)

hogehoge(1,2)

hogehogehoge(gaibu1:1, gaibu2:2)

何が言いたいかと言うと、初めの引数がなんとなく気持ち悪いってこと。でも、多くの人がそう書くだろうから無駄に混乱しないようにと言う話。たぶんこれはObjective-Cのオブジェクト指向部分の書き方が悪いんだろうと思われ。Obj-C動くようにしか書いてないから、実際は違うかもしれないけど。


ありがとう、本よ! Webがあっても本で得られる滋養って違うものがあるよね。

Swift実践入門 ── 直感的な文法と安全性を兼ね備えた言語 (WEB+DB PRESS plus)

Swift実践入門 ── 直感的な文法と安全性を兼ね備えた言語 (WEB+DB PRESS plus)

  • 作者: 石川 洋資
  • 出版社/メーカー: 技術評論社
  • 発売日: 2017/02/07
  • メディア: 単行本(ソフトカバー)


この本はかなり硬派です。すぐにSwiftでアプリを書きたいって人には向いてません。

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

コメント 0