狠狠撸

狠狠撸Share a Scribd company logo
Study Swift
2014/7/9
Urushihara Akihiro
@U_Akihir0
IntroductionIntroduction
● Swift のここがすごい!
● AltJS のような次世代的な言語設計
● LLVM-Backend による高速な動作の実現
● 過去の資産 Objective-C との連携
● ARC GC による高速なメモリ管理
目次目次
● Swift のセットアップ
● Swift の基本的な構文
● Swift の発展的な構文
目次目次
● Swift のセットアップ
● Swift の基本的な構文
● Swift の発展的な構文
SwiftSwift のセットアップのセットアップ
● XCode6 beta 以降のインストール
● XCode のダウンロードには課金アカウントが必要
– 年間 9000 円ぐらいの iOS or Mac App の開発契約
それだけ
iOS 開発環境もそれだけでセットアップ完了
– 某 Android に比べれば 100 倍も簡単!
SwiftSwift プロジェクトの作成プロジェクトの作成
●
新しいプロジェクトを作る際に言語欄で
「Swift」を選択すると Swift 向けの各種
テンプレートプロジェクトが作成される
SwiftSwift プロジェクトの作成プロジェクトの作成
●
新しいプロジェクトを作る際に言語欄で
「Swift」を選択すると Swift 向けの各種
テンプレートプロジェクトが作成される
SwiftSwift の基本的なお約束の基本的なお約束
●
変数に対して型宣言はしません
●
変数の型は自動的に推論されます
– バリアント型ではないので注意
●
一般的なオブジェクト指向の言語です
● 記述的な部分では、AltJS に近い言語です
– CofeeScript とかに近いという感じ(?)
● Class、Struct、Enum があります
●
しかし、どれでも同じようなことができる…
目次目次
● Swift のセットアップ
● Swift の基本的な構文
● Swift の発展的な構文
!書く前の注意!!書く前の注意!
●
プログラム中に日本語がある場合に補完が効きま
せん(コメントも含まれます)(XCode beta6-2)
●
コピーライトに「年」とか入ってると死ぬ
変数の型変数の型 (C(C言語との対応言語との対応))
●
基本的に大文字になると考えればいい
● int → Int
● float → Float
● double → Double
●
文字列等
● String (NSString in ObjC)
● Array, Dictionary
● AnyObject (id in ObjC)
変数の宣言変数の宣言
● let か var を付けて宣言 (基本 var でいい)
● let は Java でいう Final に近い
– 一度代入されると変更できない
●
型を明示することも可能
クラスの宣言クラスの宣言
● class 以下でクラスを宣言
● 継承とプロトコル (インターフェース) は :
以下にカンマ区切りで名前を羅列する
●
フィールドの宣言は同じ
init deinitinit deinit
●
イニシャライザとファイナライザを記述できる
●
!イニシャライザの段階でフィールド変数を
全部初期化しなければならない!
– 例外はあるが后述する
initinit のあれこれのあれこれ
● 継承した場合、super.init() を呼ばないといけない
● しかし、super.init() の前に必ず継承して追加した
フィールド変数を全て初期化しないといけない
● super.init() を呼ぶ前に継承元のフィールド変数を
読み込むような処理を書いてはいけない
initinit のあれこれのあれこれ
● 継承した場合、super.init() を呼ばないといけない
● しかし、super.init() の前に必ず継承して追加した
フィールド変数を全て初期化しないといけない
● super.init() を呼ぶ前に継承元のフィールド変数を
読み込むような処理を書いてはいけない
関数宣言関数宣言
●
関数宣言は以下のようなフォーマットで行う
● func 関数名 (引数名1:引数型1, …) -> 返り値の型 {
●
無名関数はこのようには宣言しないので注意
– Blocks という項目にて後述
オーバーライドオーバーライド
●
関数のオーバーライドは明示的に宣言する
● func の前に override と記述
静的メソッド静的メソッド
● func の前に class を付ける
●
静的フィールド変数には対応していない
– 構造体、列挙体のみ用いることができる
表示関数表示関数
● Java っぽく print, println みたいな関数がある
●
文字列の中に数値を埋め込む方法もある
文字列文字列
●
文字列は直感的に分かりやすくなった
● NSString の基本的な操作構文にも対応してる
● + で文字列結合できるよ、やったね!
– Objective-C では糞長い関数を書く必要がある
数値数値
●
数値は自動でオブジェクトにボクシングされる
● Objective-C 的には NSNumber に勝手に変化する
– 一見、生の数値に対してメソッドコールが可能
キャストキャスト
● Swift では暗黙の型変換は行われない
● 1 + 1.1 はエラーになる (型が違うため)
– 演算子オーバーロードで解決はできる
●
変数の型キャストは以下のように行う
●
型名で覆う キャスト範囲が分かりやすい
演算子オーバーロード演算子オーバーロード
●
型の演算を上書きすることもできる
● @infix を付けて関数を書き換える
タプルタプル
●
タプルを用いることができる
●
簡易的な構造体だと思えば大体あってる
(Float, Float, Float) のタプルは
struct fvec3{ float f1, f2, f3; } のようなもの
Optional TypeOptional Type
●
個人的にややっこしい部分なので強調
● Swift では安全性の為に、基本的に変数に
null の代入を許容していない
→ null の表現はどのようにしたらいいのか?
→ Optional Type を用いる
– null を許容した型と捉えればいい
? or !? or !
●
変数宣言の際に型を明示し、型名の後に
? or ! をつけると Optional Type になる
● null の代入が許容される
nullnull に対する参照に対する参照 (1)(1)
● 基本的に null に対する参照は null が返る
●
ランタイムエラーにはならず、処理が続行する
● Swift では明示的に記載しなければならない
Null 要素の場合は結果は Null になる関数呼び出し
nullnull に対する参照に対する参照 (2)(2)
● null に対する参照が行われた場合、ランタイムエ
ラーにしたいという場合も明示的に書く
● ? ではなく ! にする
Null 要素の場合ランタイムエラーになる関数呼び出し
Optional TypeOptional Type の代入の代入
● 通常の変数に Optional Type の変数を代入したい
● null の場合ランタイムエラーになる
●
単純に代入文を書くと構文エラーになる
– 代入後の変数名に ! マークを付ける
基本的にランタイムエラーに基本的にランタイムエラーに
● Optional Type だが、基本的にnull参照はランタイ
ムエラーにして欲しいし、! とか書きたくない場合
●
要するに今まで通りの変数をお望みの場合
– 変数宣言時に型の後に ? ではなく ! で宣言
● ! の記載を省略することができる (個人的には非推奨)
配列配列
● 配列の宣言は形名の後に[]をつける
or Array<型名> と宣言する
●
自動ボクシングで数値もらくらく格納!!
要素ゼロの配列で初期化
2要素の配列
同じ意味
配列配列 :: 謎仕様謎仕様
● 配列の Optional Type が使いにくい
●
何故かメンバが見付からなくなる
●
何故かインデックスアクセスができなくなる
– [] アクセスも演算子オーバーロードみたいなもの
● 一度 ! で普通の配列型に代入してから用いる
辞書辞書
●
配列とほぼ同様に辞書も用いることができる
●
しかし、型に対して注意する必要がある
●
謎バグは辞書でも発生する
格納されている変数の型は Optional Type
辞書の型辞書の型
●
辞書の型は初期化時に決定する
●
厳し目に設定されるので、よくエラーになる
●
明示的に型を表現することも可能
forfor 文文
● for 文がリッチになっている
●
列挙構文も勿論対応してるし、
タプルだったら中身まで分解できる
型のエイリアス型のエイリアス
●
型には別名を付けて参照しやすくできる
●
タプルとか辞書みたいに型が長くなるのには有効
– 構造体作れっていう突っ込みは無しで
目次目次
● Swift のセットアップ
● Swift の基本的な構文
● SwiftSwift の発展的な構文の発展的な構文
列挙型列挙型
● Swift において列挙型は以下のように定義する
● case で各列挙要素を作る
複数一気に定義できる
列挙型の型推論列挙型の型推論
●
列挙型の比較など、型推論が有効なケースについ
て、列挙型の名前の記述が省略できる
列挙型内の関数列挙型内の関数
●
列挙型内に関数を定義することができる
Self によって呼出されている
列挙体が取得できる
型に紐付いた列挙体型に紐付いた列挙体
●
列挙体に型を紐付けることができる
紐付ける型、文字列も対応
ここを基準に値を振ってくれる
列挙型を用いた列挙型を用いた SwitchSwitch
● Switch 构文で列挙型が使用できる
値を紐付いた列挙体値を紐付いた列挙体
● Enum の要素に値を紐付けることが可能
どの型の値を何個紐付けるか
Switch 文の中で取り出せる
他の文中では不明
型情報の確認型情報の確認
● AnyObject (Any) の型が何であるかを確認
● as を用いることで確認が可能
プロトコルプロトコル ((インターフェースインターフェース))
●
実装しなければならない関数を定義する
● Java でいうインターフェース
この関数を実装しなければいけない
Getter, SetterGetter, Setter
● Getter, Setter の簡単な作成方法が用意されている
●
フィールド自体が無い場合もあるので注意
X に依存した値で
フィールドとして直接値を
持つように振舞っているだけ
didset willsetdidset willset
●
フィールド変数がセットされる前と後に動作を挟
む事ができる仕組みが用意されている
構造体構造体
●
構造体は以下のように定義できます
●
勿論関数も定義できるよ!!
構造体のプロトコル構造体のプロトコル
●
構造体でもプロトコルを指定できる
●
指定された関数の実装が必須
構造体構造体 : mutating: mutating
●
構造体の内部に宣言された関数内で、メンバを書
き換える場合は関数に mutating の識別子をつける
●
高速化のためだと考えられる
letlet 文の値文の値
● Let 文は代入に成功した時に 1 を返す (?)
● Optional Chaining
– それが実行できた時のみ動作
第一級関数第一級関数
●
関数が第一級オブジェクト
● Objective-C の Blocks の役割もこれ
Objective-CObjective-C との連携との連携
● Swift プロジェクト内で Objective-C ファイルを作
成すると、Bridging-Header が作成される
● Swift で扱うファイルをインクルード
Objective-CObjective-C との連携との連携
● Swift のプログラムを Objective-C で用いる場合
● プロジェクト名-Swift.h をインクルード
変換命名規則変換命名規則
● Objective-C と Swift の関数変換
● Objective-C
● Swift
以上
ありがとうございました!

More Related Content

Study Swift