札幌で『みんなで Swif 復習会』を開催してきました。 #minna_de_swift

勉強会

念願だった勉強会の初地方遠征を、札幌で開くことができました。

札幌の勉強会 devsap と株式会社インフィニットループさまが力を貸してくれたおかげで、無事に楽しく開催できたかなって思います。


に、自分初の関東外遠征になる勉強会 みんなで Swift 復習会 GO! in 札幌 – 1st′ を開催しました。

とつぜん訪れた北海道の外の人間が開く勉強会にもかかわらず、地元のみんなの支えがあって、おかげさまで 16 人という十分な人数が集まってくれて、その上たっぷり談笑に混ざってきてくれて、とても嬉しい時間になりました。

みんなで Swift 復習会

今回の みんなで Swift 復習会 は、もともと 自分が見てきた Swift が本当に正しかったのか 分からなくなったことが発端になって始めた勉強会でした。そんな迷いは、それを機に出逢った Swift 読書勉強会 で払拭されたわけですけれど、その勉強会に参加していて、自分もそんな勉強会を開いてみたいなって思って、東京・渋谷で始めたのでした。

Apple 公式の Swift 解説書 The Swift Programming Language が自分のいちばんのお気に入りだったので、この本を最初から眺めて復習してみたら新しい発見があるかもしれない、そしてせっかくなら自分だけでなくみんなにも 復習に付き合ってもらって 自分の見解を聞いてもらいながら、みんなに訂正・補足・楽しい話を聞かせてもらえたらいいなというのが、この会の目的だったりもします。

初開催の経緯

もう一つ、日頃から思っていたこととして 趣味主体で成り立っている勉強会の楽しさをもっと東京、とりわけ渋谷の外にも広げていきたい というのもありました。

そんな想いを抱えて過ごしていたわけですけれど、前回 iPhone Dev Sapporo勉強会 Jul, 2016 に参加した帰りに、その日に会場提供してくださっていた 株式会社インフィニットループ の村元さまが ぜひこの会場を使ってください と提案してくれて、次に札幌を訪れるときは勉強会を開けたらいいなと思ってたのでした。

そして iPhone Dev Sapporo勉強会 Jan, 2017 開催の便りが届いたのと合わせて、村元さまにお願いをして、無事に同日の午前中、初の関東外遠征を果たすことができました。

テーマ

札幌で開く勉強会は、これまでに何度か渋谷で開催している『Swift 復習会』の遠征という形にしました。

この会は、もともとはハイペースで開催を重ねようと思っていたのもあって、比較的準備の負担が少ないのと、発表者は自分だけというスタイルなので、自分さえ居れば 仮に誰も来なかったとしても 大丈夫、これなら初遠征でもなんとかなりそうだったのでそうしてみました。

日程

日程を決めるにあたって、iPhone Dev 札幌勉強会の当日午前中にするか、それとも翌日午後にするかで迷ったのですけど、村元さまに相談したら devsap 主催の若林さん(@frnkさん )とも相談してくれて、今回は 当日午前中 に開催する運びになりました。

開催日を決め、申し込みページを立ち上げてみれば、村元さんも若林さんも、率先して自分の勉強会を広めてくださって、おかげさまで 16 名もの人が集まってくださいました。iPhone Dev 札幌でお馴染みの方々がきてくださったり、この勉強会のために午前中だけきてくださる人までいらして、とても嬉しい限りでした。

さらには午前中も午後も両方参加してくださる新しい顔ぶれの人もいらっしゃったみたいで、いろいろ手助けしてくださった iPhone Dev 札幌勉強会へ少しはお返しできたみたいに思えて、そんなところも嬉しい出来事でした。

いつもの調子を出せた印象

そもそもの "自分の勉強会スタイルがどうなのか" という命題はさておいて、ともあれ普段の Swift 復習会らしい会になってホッとしました。

今回は 1st′ と銘打ちましたけど、実のところ、この Swift 復習会の第 1 回目は自分の中では自分らしさが出せず、心に引きずっていた回だったので、それの再挑戦という意味も込めて 1st′ にしたんですよね。題材も、あの日の第 1 回目と同じ "Swift Tour" を題材にして。

その上でやり方を 2 回目以降のやり方に変えて臨み、イメージ通りに進行できて、これでやっと "あの日は良い日だったなー" という記憶以外がまったく不要になりました。あの日もこうして今日へと繋がっているのを思うと、良くない日ってそうそう存在しないのかもしれませんね。

みんなのノリが良い感じ

みんなで Swift 復習会は "談笑" を大事にしている会なのですけど、こちらからの投げかけにも率先して応答してくださる人が何名もいらして、自分にとっては理想的に交流の輪が広がってくれた心地がしました。

談笑は大事ですけれど、その場でただ耳を傾けて楽しんでくれる人もとても大事で、みんなが気軽にいてくれるのがいちばん良い空間を作ってくれるのかなって思うところなんですよね。だから、誰かが積極的に談笑に加わってくれることで、他の人たちが安心して聞いていられる、そんなところも大事にしたいところです。

しかしほんと、札幌のみんなが良い空間を作ってくれて、ほんと居心地良かったです。

今回の内容

さて、そんな "みんなで Swift 復習会" でしたけど、その中でお話ししたことを簡単に紹介しておきますね。

テーマ

今回のテーマは The Swift Programming Language の中の最初の最初、"Welcome to Swift" と "The Swift Tour" の "Simple Values" を題材に、みんなと談笑する運びになりました。この内容でたっぷり 2 時間、良い雰囲気で盛り上がれてとても嬉しかったです。

みんなで Swift 復習会での談笑用スライド – in 札幌 1st′ #minna_de_swift from Tomohiro Kumagai

Welcome to Swift

ここでは The Swift Programming Language に記載されていた Swift の特徴を簡単に列挙して、それについて思うところをみんなと語らう形をとりました。

その中で特筆したところとしては "動的オブジェクトモデルを採用" というところでした。これは何を指しているんだろうというこちらの問いかけに『Objective-C フレームワークを使うための仕組みが用意されていることではないか?』という話になり、そこから AnyObject の動的ディスパッチ性を紹介したり、動的ディスパッチするためには @objc が必要だったりする話を紹介しました。

さすが iPhone Dev 札幌のメンバーがいらしたのもあって、ここでけっこう盛り上がれて、楽しかったです。慣れていない人には難しい話だったと思いますけど、とりあえず @objc がどういったものか、雰囲気だけでも触れてもらえたら万々歳かなって思います。

import Foundation

class Object {

	var f: (() -> Int)?

  // @objc の "シグネチャ" が動的ディスパッチ候補に表示される
	// @objc の機能だけ AnyObject の動的ディスパッチで呼び出せる。
	@objc func doSomething() {

	}
}

let obj = Object()

// メソッドは ImplicitlyUnwrappedOptional 型なのでアンラップ等をして呼び出す
obj.f?()

do {

	// オプショナルバインディングを使うと respondsToSelector → performSelector 的な動作
	if let f = obj.f {

		f()
	}
}

extension NSString {

	// @nonobjc をつけると動的ディスパッチの対象外
	@nonobjc func doSomething() {

	}
}

let a = "TEST" as NSString
let b = a as AnyObject

b.doSomething?()

Hello World

そして Swift Tour では Hello World の紹介があって、そのお話をしました。

print("Welcome to Swift !")

ここ、Swift で決まって言われる セミコロンは不要 というところなのですけど、自分はいつも Swift でもセミコロンはちゃんと構文として用意されていることを言いたくなるんですよね。

複数のステートメントを 1 行に書きたいときは、行末記号としてセミコロンを使えるということを紹介してみたりしました。オススメしているわけではないのですけど、ちゃんと構文として存在していることは知っておいて欲しいなという願いです。

let a = 1; let b = 2; let c = a + b

それと、行末記号を省略できることによって、誤解釈を招く例も紹介してみたり。即席実行のクロージャーでかっこの位置を間違えると、全然違う動作になったりするんですよね。そうそう使う書き方ではないのですけれど。

let f = { (v: Int) -> Int in

	return v * 2
}

// これだと大丈夫だけれど、
f(
	10)

// これだと、関数型の変数と、タプルになってしまう。
f
(10)

Simple Values

値については、キーワード let で宣言した変数を 定数 と呼べるかどうかという、けっこうお馴染みな疑問が浮上して、それについて談義を楽しみました。そこから "条件分岐を使って値を変化させられる" という話題を振ってくれて、そこから話が広がりました。

let value: Int

switch arc4random() {

case 0 ..< 100:
	value = 0

default:
	value = 100
}

そこからさらに話は広がり、クロージャーの特徴とか、値型の値をキャプチャーした時の動作などをみんなと一緒に眺めて確認しました。値型の値をキャプチャーリストでキャプチャーするのと、普通に内包するのとで挙動が違って混乱するところですよね。そんな辺りをみんなで確認しながら眺められて良かったです。

func doSomething() -> () -> Int {

	var values = [1, 2, 3, 54]

	// キャプチャーリストを使う場合とそうでない場合での挙動の違い
	// この例は values にキャプチャーリストを使うとビルドエラーになるので(比較的)分かりやすい
	let sum = { () -> Int in

		values.append(100)
		return values.reduce(0, +)
	}

	values.append(10)

	return sum
}

let f = doSomething()
f()
f()

さいごに

そんな風にして、みんな良い感じに参加してくれて、楽しい復習会になりました。

言語まわりのお話なので、普段見慣れない話で難しそうに見えるかもしれないですけど、わからなくても問題ないし、初歩中の初歩な問いかけも大歓迎ですし、談笑に混ざらず聞いているだけでも OK ですし、何よりこういう言語について話せる機会ってそうそうないと思うので、ぜひ気軽に遊びに来てくださいね。

なんにしても今回は、参加してくださった人、会場を貸してくださった人、率先して協力くださった iPhone Dev 札幌のみんなのおかげで、無事に楽しく初遠征を終えることができました。素敵な経験を、どうもありがとうございました。

またどこかへ出かけるついでに勉強会を開いたり、今度は勉強会を開くことだけを目的にどこかへ出かけるのも楽しいかもしれないなって思いました。