第0回 カジュアル Swift プログラミング勉強会を開催しました #cswift
カジュアル Swift プログラミング勉強会
2015年6月6日に『カジュアル Swift プログラミング勉強会』の第0回目を横浜の青葉台で開催しました。
初回でいろいろ手探りでしたが、おかげさまで無事に初回を終えることができました。
に、横浜市青葉台の 青葉台レンタルスペース で『第0回 カジュアル Swift プログラミング勉強会 』を開催しました。
第0回と銘打ったのは、今回が初めての回にあたるため、雰囲気や方向性を決める予行演習的な意味合いを込めてのことでした。
また、東京での勉強会が主流に思える今日に、横浜の中心部からも外れた青葉台という場所にどれほどの人が集まるか分からなかったので、誰も来なくても開催する、そんな意味も込めてみました。
でもそんな心配なんていらないくらい、こんな初回に想定人数を超えて参加の声をかけて頂き、とても嬉しい限りでした。
開催の動機
今回の Swift 勉強会を開催するに至った動機は、単純に『もっと Swift を語らいたい』という気持ちが自分の中で高まったことでした。
というのも、なんだか身近に Swift について語り合える仲間がいなくて、ネットでも少なくとも自分の身近では Swift が話題に上がることはちらほらある程度でした。
そして話題に上がったとしても、応用的な話ばかりで、もう少し基礎の部分からじっくりと他の人の考えに触れられたらいいなと思いながら、ひとりで Swift を楽しむ日々が続いていました。
転機
そんなある日、お邪魔させて頂いていた Cocoa勉強会 関東 の懇親会にて、じっくりと Swift について語り合う機会に恵まれます。
その頃には自分もだいぶ勉強を重ねて、それなりに Swift のことがわかったつもりになっていたのですけど、会話を重ねて行く中で、相手が放ったふとした言葉に強い衝撃を受けたのでした。
構造体はオブジェクトじゃないよ
その言葉を聞いた瞬間に、自分がまだ理解しきれていないまま埋もれていた部分が浮き彫りになり、それによってさらに世界が広がるような心地がしました。
実現へ
そんな出来事に感動するとともに、いったん知ったつもりになってしまうと、自分だけではなかなかそこに目を向けられないなという思いが生まれました。
みんなの考えに触れる場所がないのなら、自分で作ってしまおう、そう思って今回の Swift 勉強会が開催される運びとなりました。
方向性
第0回を終えて、まだはっきりとした会の方向性は定まってはいないものの、次の3つを掲げて初回を望みました。
- Swift について語らえる場所
- 談笑しながら学びを深める
- せっかくだから楽しくありたい
これが今回ちゃんと体現できたかどうかは分かりません。でもこんな気持ちを大事にしながら、次回以降も歩みを進めていけたらいいなと思ってます。
ともあれ、この会を開こうと思った発端が「Swift について語らいたい」が目的なので、時間はゆったり気味にとって、思いつくままに雑談できる場所で在りたいものです。
語らった内容
そんな記念すべき第0回の勉強会で、みんなで談義した話題は次のようなものでした。
Swift を振り返ってみよう
まずは自分が取り上げた話題は Swift をもういちど振り返ってみようという話でした。
みんながどれくらい Swift のことを知っているか分からなかったので、ひとまず Swift について初めからおさらいしてみる時間をつくってみました。
Swift が 1 周年を迎えたのもあり、Swift が登場した WWDC 2014 から 1 年経ったのもあり、ちょうど昨年に『Objective-C without The C』という言葉とともに湧きに湧いたあの頃の記憶を思い出したいなという想いもありました。
そんな感じで軽い感じの内容でしたけど、みんなそれぞれ復習的に見てくれたみたいで、知っているところ、知らないところ、そんなあたりを確認できて良かったかなって思います。
Swift の特徴
WWDC 2014 で取り上げられた Swift の特徴といえば、次の 4 つでした。
- Fast
- Modern
- Safe
- Interactive
これらの中でも特に『Safe』が Swift を語る上で、そしてコーディングをする上で欠かせない大事なキーワードかなと、この 1 年、Swift を使っていて強く感じるところです。
ここを意識するかどうかで、コード自体も、そして Swift を気に入るかどうかも、けっこう違ってくるのかなって思います。
戻り値によるオーバーロード
そしてそんな振り返りの中で、話は「戻り値によるオーバーロードっていいよね!」という話題が上がり、Playground を使ってちょっといろいろ遊んでみました。
Swift の関数やメソッドでは、名前が同じで型が違う引数を取るオーバーロードという仕組みがあります。たとえば、次のような感じで定義できます。
func calculate(value:Int) -> Int {
return value * 3
}
func calculate(value:Double) -> Double {
return value * 3.14
}
このようにすると、引数に渡す値の型が Int
か Double
かによって、実行される関数を切り替えることができる仕組みになっています。
これと同じ考え方で、戻り値の型によっても実行する関数を切り替えられるようになっています。
func getValue() -> Int {
return 100
}
func getValue() -> String {
return "Value"
}
たとえばこのような関数があると、結果を入れる変数の型に応じて、実行する関数が切り替わるようになります。
let intValue:Int = getValue()
let strValue:String = getValue()
型を明示的に指定しなくても as
を使って切り替えることも可能です。
let intValue = getValue() as Int
let strValue = getValue() as String
これをうまく使えれば、キャスト関数が作れたり型に応じて定数を選択できるようにしたりなど、いろんな使い道がありそうな面白い機能です。
Swift1.1 で書かれた書籍を Swift1.2 で学ばざるを得なくなって、それに対処した話
続いて @takuan_oshoさん 提供の話題、Swift 1.1 のコードを Swift 1.2 に書き換えながら Swift 書籍を読み進めてみたというお話でした。
Swift 1.1 から Swift 1.2 への変更は、言語については素直にできたものの、それよりもライブラリが Swift 1.2 に対応していなかったり、肝心の CocoaPods を書籍での説明通りに動かすのに難儀したという、うっかり身構えるのを忘れてしまいがちなポイントがいくつも紹介されて、とても面白かったです。
途中、if 文のネストが深くなりすぎるから if let - where を使って 1 行にまとめたよというお話から、switch 文でも where を使えるし、けっこう便利に使える、そんな話を少ししました。
たとえば『Any 型で渡されてきた変数を String にキャストできたら hasPrefix 関数で判定したい』みたいなときはこんな感じです。
let value:Any = "TEST"
if let v = value as? String where v.hasPrefix("T") {
}
他にも『Optional な文字列型の変数に値が入っていたときには、その値が指定したプレフィックスを持っているか』を switch 文で判定することもできます。
let value:String? = "TEST"
switch value {
case .Some(let v) where v.hasPrefix("T"):
print(v)
default:
break
}
このようなことができるのは、Swift の Optional
JSON ライブラリ
そして話題の中でライブラリの話になって、そこから Swift 用の JSON ライブラリの話に少しなりました。
真っ先に挙がったのが Hearst-DD/ObjectMapper というライブラリでした。けっこうよく使われるライブラリみたいです。
そして、勉強会の中では名前を思い出せなかったんですけど、自分が耳にしたものに ikesyo/Himotoki というものがありました。
自分は JSON を避けがちなので、まだ使ったことはないんですけど、Swift の安全性の鍵になる『タイプセーフ』を念頭に置いて作られたとのことなので、もしかすると面白かったりするのかなとも思いました。自分もちょっと JSON 始めてみようかしら。
もし興味が湧いた方がいらしたら、ぜひ使って次に参加したときにでも心地とか聞かせてくれたら嬉しいです。
Swift の文字列操作
そして Kenji Sugita さんから、気合いの入った資料とともに Swift の文字列操作の基礎を広く掘り下げる話題に移りました。
そう、Swift の文字列操作ってけっこういい勉強になるんですよね。今回のお話も String 型の基本から始まり、それに関係するプロトコル、そしてそれを想定した大域関数へと、ひとつひとつ丁寧に動きを追いながら見て行く様子は、とても勉強になりました。
最初、この辺りの流儀を知らずに String を見るとぜんぜん機能がないと思ってしまって、もしかして操作するには実質 NSString への変換が不可欠なのかなと思ってしまいがちですけど、こうやって掘り下げていってみると、文字列に限らず Swift の型をどう扱うかが見えてくるのが面白いです。
それから間もなく登場した Swift 2.0 では、さらにまた文字列操作の周りが大きく変わった印象ですけど、今回のお話みたいに突き詰めて行けば、また Swift 2.0 全体の様子が見えてくると思います。
デザインにこだわったUIのお話
そして @fumiyasakaiさん からは、デザインにこだわってアプリを作ってみたというお話でした。Swift を使ったアプリ作りにしっかり取り組んでみた、そんなお話でした。
なんと2本立てです。
世間では ContainerView があまり使われてない印象だけど便利というお話とか、UI の動きを作るためにこんなところに工夫してみたとか、デザインの観点からお話が繰り広げられていて、いろいろ参考になりました。
こういうデザイン周りって、自分は普段、ついつい疎かにしてしまうんですよね。きっとそういうプログラマーって多いはず。
ところでそんな話題の中で、テーブルビューを更新するのに「今の reloadData を使う実装は、将来的にネックになり得る」という話がされたとき、それに対して「reloadRowsAtIndexPaths:withRowAnimation: を使うと良いかもしれない」という回答が出てきました。
行単位で更新がかけられるメソッドってあったんですね。これはなかなか便利そうです。
Swift の構造体について
これで予定していたみんなの発表も終わり、残り時間も 30 分と良い頃合いになったのですけど、そういえば自己紹介や発表時間の中で挙がった「Swift の構造体ってどういうときに使ったら良いか」という話が気になったので、それについて少しお話しました。
構造体は値や状態を表現するために使う型を作るときに使って、クラスは状態を制御する機能の集合体を作るときに使う、端的にまとめるとそんな感じです。
そう捉えると、いわゆる値渡しや参照渡しというような挙動まわりもしっくりしますし、そっくりでありながらもところどころ微妙に違う仕様についてもしっくりくるように感じます。
そんなあたりの話については、以前に Cocoa 勉強会関西で話したスライドが参考になると思うので、気になる人はこちらでおさらいしてみてください。
まとめ
初回だったので手探り感も強かったように感じますけど、こうして振り返ってみると、なかなか実りある勉強会になったかなって思えました。
たっぷりとったはずの時間もほとんど残らなかった感じで、時間配分的にはひとまずこれで良さそうですね。必要な都度、みんなで調べたり Playground を使って遊んだりするには、ちょうど良いか、むしろこれでも若干足りなくなるかもしれません。
そんな感じで、手応え的にはまずまずだったので、次回もまたこんな感じで開催してみようかなって思います。Swift 2.0 も出たことですし、そんな話もいろいろみんなとできたら楽しそうですね。
そして最後に、勉強会でのツイートの様子は 第0回 カジュアル Swift プログラミング勉強会@青葉台まとめ #cswift - Togetterまとめ にまとめました。
参加してくれた方々、呟いて守り立ててくれた方々、見守っていてくれた方々、ありがとうございました。