第二回AKIBA.swift を開催しました! #akibaswift
こんぬづは、ラブライブ!の真姫ちゃんを愛しています田中です。
弊社主催のAKIBA.swiftの第二回が2016/05/30に開催されました! 今日はそのまとめをお送りします!
第二回のテーマ
第2回はSwiftとObjective-Cの文法比較をテーマにお届けします! Swiftの登場により、iOS開発はこれまでのObjective-Cのみによる開発からさらに幅を広げることとなりました。 SwiftとObjective-C、それぞれの文法を知ることでより良いiOS開発をしていきましょう。
はじめに
司会担当の弊社田宮から初めのあいさつとタイムテーブルの説明等がありました。
第一回開催より落ち着いた様子の田宮さん
「Swiftの型システム」 平川 剛一さん@GyazSquare
概要
SwiftはObjective-Cと異なり、型安全な言語である。本発表では、この型安全性を保証するためにSwiftが採用している型システムの概要と、その中でも特に型安全性と型推論について、その特徴や実例を簡単に紹介する。
内容
- 平川剛一さん
- 一人で会社をしています
- もともとメーラ、デバイス制御、MDM系等々作っていました
- Objective-C歴20年!!
- 最近作ったアプリ
- SUM! - かわいい数字で算数遊び
- Swiftオンリーで作りました
- App Storeの子供向けカテゴリでおすすめに掲載!
- Museクリエイティブアワードプラチナ賞受賞!
- Swift's Type System
- Type System: 型システム
- Type Checking: 型チェック
- Strong and Weak Typing: 強い型付けと弱い型付け
- Type Safety: 型の安全性
- Type Inference: 型推論
- 型システムとはなにか?
- プログラムの「一貫性」をチェックするルールの集合
- 型システムは何が良いの?
- エラーの検出
- 抽象化
- ドキュメンテーション
- 言語の安全性
- 効率性 浮動小数点と整数型など、違いのある型を指定してあげるとコンパイラにとって効率的に計算できる
- 型チェックとは?
プログラムの値や式の型が正しいかどうか検証する機構
- 静的型チェック コンパイル時に型をチェックする
- 動的型チェック 実行時に型をチェックする
「静的だから」「動的だから」ということでどちらの方が安全性が高いとかは言えない
-
Run-Time Type Information
- 動的ディスパッチ
- 遅延バインディング
- ダウンキャスト
- リフレクション
- 等々...
- Swift's RTTI
- Swiftも静的型付け言語といえど、RTTIがある
- Swiftではis, as? as!(asは静的)がこれにあたる
- isの挙動がちょっとバグってるっぽい?
- 強い型付けと弱い型付け
- プログラミング言語の説明によく「強い型付け」「弱い型付け」とかの説明があるけど、これの明確な定義はない
- Appleのドキュメントにはこういう説明はない
- Type Safety
- 型の安全性っていうのは、プログラミング言語が型エラーをどの程度抑止/禁止するかによって決まる
- 「異常終了するからこの言語はダメ」ということはなく、エラーに対してどう対処する仕様になっているかという話なだけ
- Type Unsafe Examples
- メモリ破壊を起こしてしまうなど
- Objective-C的なnilは存在しない Swiftのnilはオブジェクトだけど、Objective-Cのnilは0である
- Type Inference(型推論)
- Swiftの型推論は単一の式、文のレベルで動作
- まだ他の言語と比べると限定的な使い方になるところがある
- とはいえObjective-Cと比べるとだいぶ省略されて良い
- Numeric Literals(数値リテラル)
- 整数はデフォルトでIntとしてみられる
- 浮動小数点はデフォルトでDoubleとしてみられる
- 型推論の良くない例
- 「型推論は積極的に利用しよう!」とかよく言われるけれどそれはどうか?
- メソッドの引数の型をCGFloatで指定してあったりする場合、数値リテラルの結果整数を入れても勝手にCGFloatになってくれる!
「Enumはデキる子 ~case .Success(let value):~」 田中 孝明@クラスメソッド
概要
Objective-CからSwiftへの大きな変更点の一つにEnumの強化があります。 Enumの有効活用によって型安全で保守しやすいコードを目指すことができるといっても過言ではないでしょう。 Enumの変更内容及び、実例も含めてお話できればと思います。
内容
- 田中孝明さん
- クラスメソッド株式会社所属
- 平川さんと前職同じです
- Enum
-
SwiftでのEnumの特徴
- 独自メソッドを定義できるのとても良いと思う
- RawValue
- Stringでも定義できる
- ネスト
- Enumの中にEnumを定義できる
- 独自のメソッド定義
-
計算型プロパティを定義できる
-
AlamofireのRouterでの応用
-
ジェネリクスの応用
- tupleとジェネリクスを指定することで成功時、失敗時も値を返すEnumを定義することができる
- Result型で定義することで、パターンマッチによってより安全に処理を書くことができる
- Core Dataを使ったデモ
-
メソッドなどのStringで指定するレガシーなObjective-CからのAPIを、SwiftのEnumでラップして安全に使うのは定番
「Objective-C のキャストと Swift の型変換を比べてみる」 熊谷 友宏さん
概要
異なる型を扱うときに Objective-C ではキャストを使って合わせていました。Swift では主に型変換を使います。そんな2つの基本的な性質の違いを “安全性” の観点でざっくり眺めみようと思います。
内容
- 熊谷さん
- Objective-Cのキャストと型変換
- ある型の値を別の型で表現し直す
- C-styleのキャストを使う
- 言語が変換機能を提供
- 誤差に注意
- 数値の丸め方は気をつけなきゃいけない
- 型が混在した場合は言語で精度が高いと設定されているものに型が統一される
- Objective-Cのキャスト
- キャストしたからといって、変換されるわけじゃない
- ここで使うのがisKindOfClass
- Objective-Cの変換は複雑だという印象があります
- 変換に失敗した時に気付きにくいのはなかなか致命的
- なのでプログラマがちゃんと把握してないといけない
- Swiftのキャスト
- 変換
- キャスト
- Full-Width変換
- ある型の値を別の型へ「変換する」
- swiftにおいては、変換する時はinitializerを使う
- Full-Width変換が出来ない時
- 通知してくれる
- Narrow変換
- 意味が変わる可能性のある型変換
- 引数ラベル付きイニシャライザで実装
- ラベルがないのはFull-Width。ラベルがあるのはNarrow変換
- クラスのキャスト
- as演算子を使う
- アップキャストはas
- ダウンキャストはas?, as!
- as?の使い所は、失敗した時にスルーさせたいとき
- as!の使い所は、失敗した時にプログラムを落としたい時
- ここまでのまとめ
- シンプルで明瞭な印象
- Objective-CとSwiftの差は変換が自動的か、明示的か。明治的なSwiftの方が楽に感じる
- 責任の観点
- 独自の変換機構を使う
-
Objective-Cの場合
- 変換元または変換先が責任をもって変換する
- 存在しない場合もある
- initWithとか、toIntegerなどを独自実装する
- 自作クラスの中ではキャストなど使わない(内部でやってる)
- 実際中でFull-Width変換なのかNarrow変換なのかは想像しないといけない!
- Swiftの場合
- 変換先が責任をもって変換する
- ラベル名を省略したinitializerを自分で作成する
懇親会
今回は懇親会を勉強会会場でビアバッシュ形式で行いました。 良い意味でゆるめな感じで人と話せる雰囲気があってとても盛り上がりました!
まとめ
型ということが主として取り上げられましたが、Swiftの型への考え方がObjective-Cや他の言語と比較してどういったものなのかということがよくわかりました。 どういう考え方でそうなっているかを考えると、それぞれのアプローチでなにが良いか悪いかではなくそういう決めをしているのだという話が全体を通して伺えて、考え方の良い参考になりました。
懇親会も盛り上がって新たな出会いの場となったので、第二回AKIBA.swiftは大成功でした!