Slide 1

Slide 1 text

Swift への愛 @hirothings

Slide 2

Slide 2 text

Swift との出会い エンジニアとしてキャリアをスター トした2015 冬。 それまでJS, PHP 少々.. だけど戦力にならず 何もできないので、 案件の Swift 試してみる担当 になり、Swift と出会っ た。

Slide 3

Slide 3 text

Swift との出会い ‑ 最初のタスク 上司: とりあえず、Objective‑C で書いたプロトタイプのコー ドあるか ら、Swift 化してみて 自分: いや、 どっちもわからん。。

Slide 4

Slide 4 text

Swift との出会い ‑ それから わからんのが悔しくてアプリを作ってみたり、 案件で少しずつ画面やAPI 連携を作ってみたり そして現在..

Slide 5

Slide 5 text

Swift 最高

Slide 6

Slide 6 text

Swift とは Apple が2014 に発表したプログラミング言語 のちオー プンソー ス化(https://github.com/apple/swift) 「 速い, モダン, 安全」 アイコンはアマツバメ

Slide 7

Slide 7 text

Swift のここが好き 1. 静的型付け言語 2. モダンな言語 3. null 安全な言語 4. 値型中心の言語 5. Protocol + Protocol Extension 6. Generics

Slide 8

Slide 8 text

1. 静的型付け言語

Slide 9

Slide 9 text

静的型付け言語とは プログラム実行前に型の情報を決定する言語。 誤った型の代入などがコンパイル時に検出されるため、 安全性が高い。 型が明確なため、 補完が強力

Slide 10

Slide 10 text

2. モダンな言語

Slide 11

Slide 11 text

型推論 l e t s t r : S t r i n g = " h i r o s h i だお" l e t s t r = " h i r o s h i だお"

Slide 12

Slide 12 text

クロー ジャ JS やってる人ならお馴染み l e t d o u b l e = { ( x : I n t ) - > I n t i n x * 2 } d o u b l e ( 2 ) / / 即時関数でU I の定義したり、 コー ルバック書いたり l e t l a b e l : U I L a b e l = { l e t l b = U I L a b e l ( f r a m e : C G R e c t ( x : 0 , y : 0 , w i d t h : 2 0 0 , h e i g l b . b a c k g r o u n d C o l o r = U I C o l o r . r e d l b . t e x t = " h o g e " r e t u r n l b } ( )

Slide 13

Slide 13 text

高階関数 filter, map, flatMap, reduce.. l e t a r r = [ 0 , 1 , 3 , 5 , 7 , 1 1 ] l e t d o u b l e d A r r = a r r . m a p { ( n u m : I n t ) i n n u m * 2 }

Slide 14

Slide 14 text

パター ンマッチング l e t a n y : A n y = 1 s w i t c h a n y { c a s e l e t s t r a s S t r i n g : p r i n t ( " m a t c h : \ ( s t r ) " ) c a s e l e t i n t a s I n t : p r i n t ( i n t ) d e f a u l t : p r i n t ( " d e f a u l t " ) } 他にも色々 ある 詳しくはSwift 2 のパター ンマッチ構文集( ほぼ翻訳) 参照

Slide 15

Slide 15 text

3. null 安全な言語

Slide 16

Slide 16 text

null 安全とは ヌルポを実行時ではなく実行前にコンパイラがエラー として警告してく れる仕組み

Slide 17

Slide 17 text

Optional 型 nil かもしれないですよ型。 l e t a : I n t ? = n i l / / ? はo p t i o n a l 型のシンタックスシュガー Optional 型だけnil を受け取れる l e t u r l : U R L ? = U R L ( s t r i n g : " h t t p s : / / h i r o s h i . c o m " ) / / ① l e t s a f a f i V C = S F S a f a r i V i e w C o n t r o l l e r ( u r l : u r l ) / / ② ➀:url が空文字などで開けないかもしれない。 から標準ライブラリの URL はoptional 型で初期化される ➁: アプリ内でsafari を開けるViewController にURL を渡そうとするが、 Optional 型のままだとエラー がでてビルドできない

Slide 18

Slide 18 text

アンラップ Optional 型から安全にnil を除去して値を取り出すこと / / g u a r d 文。n i l だったら早期退出させる g u a r d l e t u r l : U R L ? = U R L ( s t r i n g : " h t t p s : / / h i r o s h i . c o m " ) e l s e r e t u r n } l e t s a f a f i V C = S F S a f a r i V i e w C o n t r o l l e r ( u r l : u r l ) / / S u c c e s s ! / / 他にもこんな書き方とかある( ? ? 演算子) l e t n a m e : S t r i n g ? = n i l / / n a m e がn i l だったらh i r o s h i は" s a d a o ! " l e t h i r o s h i = n a m e ? ? " s a d a o ! "

Slide 19

Slide 19 text

4. 値型中心の言語

Slide 20

Slide 20 text

参照型 値そのものを保持するのではなく、 値のメモリアドレスを保持する型。 代入時、 コピー ではなく同じインスタンスを参照するから参照型。

Slide 21

Slide 21 text

参照型の問題 コー ドを見ないとどこで参照されて、 どこまでインスタンスが共有され るのか不明 ひろしがさだおになって大事故な例 c l a s s U s e r { l e t i d : I n t v a r n a m e : S t r i n g i n i t ( i d : I n t , n a m e : S t r i n g ) { s e l f . i d = i d s e l f . n a m e = n a m e } } l e t h i r o s h i = U s e r ( i d : 1 0 0 1 , n a m e : " h i r o s h i " ) l e t s a d a o = h i r o s h i s a d a o . n a m e = " s a d a o !" d u m p ( h i r o s h i ) / / i d : 1 0 0 0 , n a m e : s a d a o !

Slide 22

Slide 22 text

値型 代入時、 値はコピー されるため、 インスタンスは共有されない。 Swift のStruct( 構造体) は値型 ひろしはひろしでさだおはさだおな例 s t r u c t U s e r { l e t i d : I n t v a r n a m e : S t r i n g } l e t a = U s e r ( i d : 1 0 0 1 , n a m e : " h i r o s h i " ) l e t b = a b . n a m e = " s a d a o " d u m p ( a ) / / i d : 1 0 0 0 , n a m e : h i r o s h i

Slide 23

Slide 23 text

値型中心の言語

Slide 24

Slide 24 text

値型中心の言語 Swift では値型の構造体を積極的に利用した設計が推奨されている (Swift 実践入門 p.248) Swift の標準ライブラリはほとんどがStruct String Array Dictionary Bool Int Double Float Swift 実践入門を買いなさい

Slide 25

Slide 25 text

コピー ごとにコストがかかるのでは?

Slide 26

Slide 26 text

Copy on Write 代入時点ではコピー が発生しない。 代入した値を変更時、 初めてコピー が発生する仕組み l e t a = [ 2 , 3 , 5 , 7 ] v a r b = a / / ここでコピー は発生しない p r i n t ( b ) b [ 2 ] = 4 / / ここでコピー が発生する 参考:Swift のArray が実はすばらしかった 参考: 純粋値型Swift

Slide 27

Slide 27 text

5. Protocol + Protocol Extension

Slide 28

Slide 28 text

継承の問題点 基底クラスで何が行われているのか分かりづらい 多重継承ができないSwift では顕著 例外ケー スが出た場合、 コー ドが肥大化, 複雑化する

Slide 29

Slide 29 text

コー ドが肥大化, 複雑化する例 1. 各画面共通の見た目だから、BaseViewController クラスを作成 2. showAlert メソッドを基底クラスに実装 3. 『 この画面だけアラー トの出し方を変えたい』 by: デザイナー 4. Base クラスの変更に迫られる。 変更時の影響が大 Base クラスに条件分岐を書く Override したサブクラスを作成し、 継承させる Base クラスからshowAlert を剥がす

Slide 30

Slide 30 text

Protocol で解決

Slide 31

Slide 31 text

Protocol とは 型のインター フェー スを定義するもの 複数のprotocol に準拠させることができる 継承が利用できない構造体でも使用できる 機能単位でprotocol を作るので、 何のprotocol に準拠しているのか 明確 p r o t o c o l s h o w A l e r t T y p e { v a r m e s s a g e : S t r i n g { g e t } f u n c s h o w A l e r t ( m e s s a g e : S t r i n g ) } / / 複数のp r o t o c o l を組み合わせて機能を実現する c l a s s h o g e V i e w C o n t r o l l e r : U I V i e w C o n t r o l l e r , s h o w A l e r t T y p e , v a r m e s s a g e : S t r i n g = " " / / 実装しないとエラー になる f u n c s h o w A l e r t ( m e s s a g e : S t r i n g ) { . . . } / / 実装しないとエラー にな

Slide 32

Slide 32 text

Protocol Extension

Slide 33

Slide 33 text

Protocol Extension とは デフォルト実装を定義できる where Self で型の指定が可能 p r o t o c o l s h o w A l e r t T y p e { f u n c s h o w A l e r t ( m e s s a g e : S t r i n g ) } / / U I V i e w C o n t r o l l e r o r サブクラスで使用可能 e x t e n s i o n s h o w A l e r t T y p e w h e r e S e l f : U I V i e w C o n t r o l l e r { f u n c s h o w A l e r t ( m e s s a g e : S t r i n g ) { l e t a l e r t = U I A l e r t C o n t r o l l e r ( t i t l e : n i l , m e s s a g e : m e s s l e t d e f A c t i o n = U I A l e r t A c t i o n ( t i t l e : " O K " , s t y l e : . a l e r t . a d d A c t i o n ( d e f A c t i o n ) s e l f . p r e s e n t ( a l e r t , a n i m a t e d : t r u e , c o m p l e t i o n : n i l } }

Slide 34

Slide 34 text

使い方 Protocol に準拠したクラスでメソッドを呼び出すだけ c l a s s h o g e V i e w C o n t r o l l e r : s h o w A l e r t T y p e , B a n n e r V i e w T y p e { s h o w A l e r t ( m e s s a g e : " エラー です" ) }

Slide 35

Slide 35 text

6. Generics

Slide 36

Slide 36 text

Generics は強力 Generics を使うと型の恩恵を失わず、 汎用的な実装ができる ジェネリック関数 f u n c 関数名< 型引数> ( 引数) - > 戻り値の型 { } 他にもジェネリック型とかあるよ! 詳しくは神本買ってね!( 雑) / / Q i i t a R e q u e s t 型に準拠するクラス・ 構造体なら何でも渡せるA P I 呼び出し関数 f u n c c a l l < R e q u e s t : Q i i t a R e q u e s t > ( r e q u e s t : R e q u e s t ) - > O b s e r v a b l

Slide 37

Slide 37 text

Swift のここが辛い

Slide 38

Slide 38 text

Swift のここが辛い ビルドが遅い( 初期は差分ビルドすらなかったが改善されて来てる) 補完が遅い(Xcode のせいでもある) 書き方が多くて最初悩む( 特にクロー ジャ) 型に厳格なので、 実装に時間がかかる( これは慣れの問題かも..)

Slide 39

Slide 39 text

Swift4

Slide 40

Slide 40 text

Codable Swift 標準で、JSON のシリアライズ・ デシリアライズができるようにな った( 今までは代々、 ライブラリ頼みだった) 参考:https://github.com/apple/swift‑ evolution/blob/master/proposals/0166‑swift‑archival‑ serialization.md p u b l i c s t r u c t F a r m : C o d a b l e { p u b l i c l e t n a m e : S t r i n g p u b l i c l e t l o c a t i o n : L o c a t i o n p u b l i c l e t a n i m a l s : [ A n i m a l ] } d o { l e t f a r m = t r y J S O N D e c o d e r ( ) . d e c o d e ( F a r m . s e l f , f r o m : p a y l o a / / E x t r a c t e d a s u s e r t y p e s : l e t c o o r d i n a t e s = " \ ( f a r m . l o c a t i o n . l a t i t u d e , f a r m . l o c a t i o n . } c a t c h { / / E n c o u n t e r e d e r r o r d u r i n g d e s e r i a l i z a t i o n }

Slide 41

Slide 41 text

文字列周りAPI の強化 複数行に渡る文字列 p r i n t ( " " " あいうえお かきくけこ さしすせそ たちつてと なにぬねの はひふへほ まみむめも や ゆ よ らりるれろ わ を ん " " " )

Slide 42

Slide 42 text

文字列周りAPI の強化 characters 型を介さなくても文字列が扱いやすくなった。 (String がCollectionType になったため) > S w i f t 3 l e t s t r i n g = " w e c a n ' t " l e t p r e f i x e d = S t r i n g ( s t r i n g . c h a r a c t e r s . p r e f i x ( 6 ) ) > S w i f t 4 l e t s t r i n g = " w e c a n ` t " l e t p r e f i x e d = s t r i n g . p r e f i x ( 6 ) l e t s u b s t r i n g = s t r i n g [ i n d e x . . . ] 参考: 他にもDictionaly が使いやすくなったり色々 ある https://www.raywenderlich.com/163857/whats‑new‑swift‑4

Slide 43

Slide 43 text

Migrating to Swift 4 手順 1. Xcode9 をインストー ルする 2. Swift 3.2 でアプリが正常にビルドできるようにする 3. Swift4 対応のバー ジョンにライブラリをアップデー トする 4. Edit ‑> Convert ‑> To Current Swift Syntax… https://swift.org/migration‑guide‑swift4/

Slide 44

Slide 44 text

まとめ: 私にとってSwift とは

Slide 45

Slide 45 text

先生みたいな存在 型に対して厳しく、 自然とタイプセー フな書き方を指南される 型っていいよねー。 って言えるようになったw モダンな書き方をしようという文化がある 初心者に厳しくも優しい 値型が主なのはとっつきやすい Class 設計について考えさせられる 自分はPHP チョットデキル程度だったので特に

Slide 46

Slide 46 text

でもiphone アプリやらないし..

Slide 47

Slide 47 text

Server‑Side‑Swift まだ発展途上なので、 ライブラリ作ったり色々 できるよ( 雑) kitura http://www.kitura.io/ vapor https://vapor.codes/

Slide 48

Slide 48 text

Playground さっと書いてすぐコー ドを試せるツー ル。Xcode に標準で入っている 競技プログラミング in Swift 標準入力を受け取るような問題を解いてみる 参考( 昔書いた記事):[ 改編]Swift を使ってPaiza の問題を解く

Slide 49

Slide 49 text

Swift 最高 ‑ 完