57
Study Swift 2014/7/9 Urushihara Akihiro @U_Akihir0

Study Swift

Embed Size (px)

DESCRIPTION

仲間内で Swift の勉強しよう、ってので作った資料 折角なので共有します。 時間がなく適当につくったものなので、 理解不足等あると思いますので、ご了承ください。

Citation preview

Page 1: Study Swift

Study Swift2014/7/9

Urushihara Akihiro@U_Akihir0

Page 2: Study Swift

IntroductionIntroduction

● Swift のここがすごい!● AltJS のような次世代的な言語設計● LLVM-Backend による高速な動作の実現● 過去の資産 Objective-C との連携● ARC GC による高速なメモリ管理

Page 3: Study Swift

目次目次● Swift のセットアップ● Swift の基本的な構文● Swift の発展的な構文

Page 4: Study Swift

目次目次● Swift のセットアップ● Swift の基本的な構文● Swift の発展的な構文

Page 5: Study Swift

Swift Swift のセットアップのセットアップ● XCode6 beta 以降のインストール

● XCode のダウンロードには課金アカウントが必要– 年間 9000 円ぐらいの iOS or Mac App の開発契約

それだけiOS 開発環境もそれだけでセットアップ完了– 某 Android に比べれば 100 倍も簡単!

Page 6: Study Swift

Swift Swift プロジェクトの作成プロジェクトの作成● 新しいプロジェクトを作る際に言語欄で

「Swift」を選択すると Swift 向けの各種テンプレートプロジェクトが作成される

Page 7: Study Swift

Swift Swift プロジェクトの作成プロジェクトの作成● 新しいプロジェクトを作る際に言語欄で

「Swift」を選択すると Swift 向けの各種テンプレートプロジェクトが作成される

Page 8: Study Swift

Swift Swift の基本的なお約束の基本的なお約束● 変数に対して型宣言はしません

● 変数の型は自動的に推論されます– バリアント型ではないので注意

● 一般的なオブジェクト指向の言語です● 記述的な部分では、AltJS に近い言語です

– CofeeScript とかに近いという感じ(?)

● Class、Struct、Enum があります● しかし、どれでも同じようなことができる…

Page 9: Study Swift

目次目次● Swift のセットアップ● Swift の基本的な構文● Swift の発展的な構文

Page 10: Study Swift

!書く前の注意!!書く前の注意!● プログラム中に日本語がある場合に補完が効きま

せん(コメントも含まれます)(XCode beta6-2)● コピーライトに「年」とか入ってると死ぬ

Page 11: Study Swift

変数の型 変数の型 (C(C言語との対応言語との対応))● 基本的に大文字になると考えればいい

● int → Int● float → Float● double → Double

● 文字列等● String (NSString in ObjC)● Array, Dictionary● AnyObject (id in ObjC)

Page 12: Study Swift

変数の宣言変数の宣言● let か var を付けて宣言 (基本 var でいい)

● let は Java でいう Final に近い– 一度代入されると変更できない

● 型を明示することも可能

Page 13: Study Swift

クラスの宣言クラスの宣言● class 以下でクラスを宣言

● 継承とプロトコル (インターフェース) は : 以下にカンマ区切りで名前を羅列する

● フィールドの宣言は同じ

Page 14: Study Swift

init deinitinit deinit

● イニシャライザとファイナライザを記述できる● !イニシャライザの段階でフィールド変数を

全部初期化しなければならない!– 例外はあるが後述する

Page 15: Study Swift

init init のあれこれのあれこれ● 継承した場合、super.init() を呼ばないといけない

● しかし、super.init() の前に必ず継承して追加したフィールド変数を全て初期化しないといけない

● super.init() を呼ぶ前に継承元のフィールド変数を読み込むような処理を書いてはいけない

Page 16: Study Swift

init init のあれこれのあれこれ● 継承した場合、super.init() を呼ばないといけない

● しかし、super.init() の前に必ず継承して追加したフィールド変数を全て初期化しないといけない

● super.init() を呼ぶ前に継承元のフィールド変数を読み込むような処理を書いてはいけない

Page 17: Study Swift

関数宣言関数宣言● 関数宣言は以下のようなフォーマットで行う

● func 関数名 (引数名1:引数型1, …) -> 返り値の型 {● 無名関数はこのようには宣言しないので注意

– Blocks という項目にて後述

Page 18: Study Swift

オーバーライドオーバーライド● 関数のオーバーライドは明示的に宣言する

● func の前に override と記述

Page 19: Study Swift

静的メソッド静的メソッド● func の前に class を付ける

● 静的フィールド変数には対応していない– 構造体、列挙体のみ用いることができる

Page 20: Study Swift

表示関数表示関数● Java っぽく print, println みたいな関数がある

● 文字列の中に数値を埋め込む方法もある

Page 21: Study Swift

文字列文字列● 文字列は直感的に分かりやすくなった

● NSString の基本的な操作構文にも対応してる● + で文字列結合できるよ、やったね!

– Objective-C では糞長い関数を書く必要がある

Page 22: Study Swift

数値数値● 数値は自動でオブジェクトにボクシングされる

● Objective-C 的には NSNumber に勝手に変化する– 一見、生の数値に対してメソッドコールが可能

Page 23: Study Swift

キャストキャスト● Swift では暗黙の型変換は行われない

● 1 + 1.1 はエラーになる (型が違うため)– 演算子オーバーロードで解決はできる

● 変数の型キャストは以下のように行う● 型名で覆う キャスト範囲が分かりやすい

Page 24: Study Swift

演算子オーバーロード演算子オーバーロード● 型の演算を上書きすることもできる

● @infix を付けて関数を書き換える

Page 25: Study Swift

タプルタプル● タプルを用いることができる

● 簡易的な構造体だと思えば大体あってる(Float, Float, Float) のタプルはstruct fvec3{ float f1, f2, f3; } のようなもの

Page 26: Study Swift

Optional TypeOptional Type

● 個人的にややっこしい部分なので強調

● Swift では安全性の為に、基本的に変数にnull の代入を許容していない→ null の表現はどのようにしたらいいのか?→ Optional Type を用いる– null を許容した型と捉えればいい

Page 27: Study Swift

? or !? or !

● 変数宣言の際に型を明示し、型名の後に? or ! をつけると Optional Type になる● null の代入が許容される

Page 28: Study Swift

null null に対する参照 に対する参照 (1)(1)

● 基本的に null に対する参照は null が返る● ランタイムエラーにはならず、処理が続行する● Swift では明示的に記載しなければならない

Null 要素の場合は結果は Null になる関数呼び出し

Page 29: Study Swift

null null に対する参照 に対する参照 (2)(2)

● null に対する参照が行われた場合、ランタイムエラーにしたいという場合も明示的に書く● ? ではなく ! にする

Null 要素の場合ランタイムエラーになる関数呼び出し

Page 30: Study Swift

Optional Type Optional Type の代入の代入● 通常の変数に Optional Type の変数を代入したい

● null の場合ランタイムエラーになる● 単純に代入文を書くと構文エラーになる

– 代入後の変数名に ! マークを付ける

Page 31: Study Swift

基本的にランタイムエラーに基本的にランタイムエラーに● Optional Type だが、基本的にnull参照はランタイ

ムエラーにして欲しいし、! とか書きたくない場合● 要するに今まで通りの変数をお望みの場合

– 変数宣言時に型の後に ? ではなく ! で宣言● ! の記載を省略することができる (個人的には非推奨)

Page 32: Study Swift

配列配列● 配列の宣言は形名の後に[]をつける

or Array<型名> と宣言する● 自動ボクシングで数値もらくらく格納!!

要素ゼロの配列で初期化

2要素の配列

同じ意味

Page 33: Study Swift

配列 配列 : : 謎仕様謎仕様● 配列の Optional Type が使いにくい

● 何故かメンバが見付からなくなる● 何故かインデックスアクセスができなくなる

– [] アクセスも演算子オーバーロードみたいなもの● 一度 ! で普通の配列型に代入してから用いる

Page 34: Study Swift

辞書辞書● 配列とほぼ同様に辞書も用いることができる

● しかし、型に対して注意する必要がある● 謎バグは辞書でも発生する

格納されている変数の型は Optional Type

Page 35: Study Swift

辞書の型辞書の型● 辞書の型は初期化時に決定する

● 厳し目に設定されるので、よくエラーになる● 明示的に型を表現することも可能

Page 36: Study Swift

for for 文文● for 文がリッチになっている

● 列挙構文も勿論対応してるし、タプルだったら中身まで分解できる

Page 37: Study Swift

型のエイリアス型のエイリアス● 型には別名を付けて参照しやすくできる

● タプルとか辞書みたいに型が長くなるのには有効– 構造体作れっていう突っ込みは無しで

Page 38: Study Swift

目次目次● Swift のセットアップ● Swift の基本的な構文● Swift Swift の発展的な構文の発展的な構文

Page 39: Study Swift

列挙型列挙型● Swift において列挙型は以下のように定義する

● case で各列挙要素を作る複数一気に定義できる

Page 40: Study Swift

列挙型の型推論列挙型の型推論● 列挙型の比較など、型推論が有効なケースについ

て、列挙型の名前の記述が省略できる

Page 41: Study Swift

列挙型内の関数列挙型内の関数● 列挙型内に関数を定義することができる

Self によって呼出されている列挙体が取得できる

Page 42: Study Swift

型に紐付いた列挙体型に紐付いた列挙体● 列挙体に型を紐付けることができる

紐付ける型、文字列も対応

ここを基準に値を振ってくれる

Page 43: Study Swift

列挙型を用いた 列挙型を用いた SwitchSwitch

● Switch 構文で列挙型が使用できる

Page 44: Study Swift

値を紐付いた列挙体値を紐付いた列挙体● Enum の要素に値を紐付けることが可能

どの型の値を何個紐付けるか

Switch 文の中で取り出せる他の文中では不明

Page 45: Study Swift

型情報の確認型情報の確認● AnyObject (Any) の型が何であるかを確認

● as を用いることで確認が可能

Page 46: Study Swift

プロトコル プロトコル ((インターフェースインターフェース))● 実装しなければならない関数を定義する

● Java でいうインターフェース

この関数を実装しなければいけない

Page 47: Study Swift

Getter, SetterGetter, Setter

● Getter, Setter の簡単な作成方法が用意されている● フィールド自体が無い場合もあるので注意

X に依存した値でフィールドとして直接値を持つように振舞っているだけ

Page 48: Study Swift

didset willsetdidset willset

● フィールド変数がセットされる前と後に動作を挟む事ができる仕組みが用意されている

Page 49: Study Swift

構造体構造体● 構造体は以下のように定義できます

● 勿論関数も定義できるよ!!

Page 50: Study Swift

構造体のプロトコル構造体のプロトコル● 構造体でもプロトコルを指定できる

● 指定された関数の実装が必須

Page 51: Study Swift

構造体 構造体 : mutating: mutating● 構造体の内部に宣言された関数内で、メンバを書

き換える場合は関数に mutating の識別子をつける● 高速化のためだと考えられる

Page 52: Study Swift

let let 文の値文の値● Let 文は代入に成功した時に 1 を返す (?)

● Optional Chaining– それが実行できた時のみ動作

Page 53: Study Swift

第一級関数第一級関数● 関数が第一級オブジェクト

● Objective-C の Blocks の役割もこれ

Page 54: Study Swift

Objective-C Objective-C との連携 との連携 ● Swift プロジェクト内で Objective-C ファイルを作

成すると、Bridging-Header が作成される● Swift で扱うファイルをインクルード

Page 55: Study Swift

Objective-C Objective-C との連携との連携● Swift のプログラムを Objective-C で用いる場合

● プロジェクト名-Swift.h をインクルード

Page 56: Study Swift

変換命名規則変換命名規則● Objective-C と Swift の関数変換

● Objective-C

● Swift

Page 57: Study Swift

以上ありがとうございました!