Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Swiftへの愛

 Swiftへの愛

Swift未経験のエンジニアを対象にSwiftの魅力について語りました。

hirothings

August 02, 2017
Tweet

More Decks by hirothings

Other Decks in Programming

Transcript

  1. Swift のここが好き 1. 静的型付け言語 2. モダンな言語 3. null 安全な言語 4.

    値型中心の言語 5. Protocol + Protocol Extension 6. Generics
  2. 型推論 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 だお"
  3. クロー ジャ 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 } ( )
  4. 高階関数 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 }
  5. パター ンマッチング 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 のパター ンマッチ構文集( ほぼ翻訳) 参照
  6. 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 型のままだとエラー がでてビルドできない
  7. アンラップ 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 ! "
  8. 参照型の問題 コー ドを見ないとどこで参照されて、 どこまでインスタンスが共有され るのか不明 ひろしがさだおになって大事故な例 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 !
  9. 値型 代入時、 値はコピー されるため、 インスタンスは共有されない。 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
  10. 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
  11. コー ドが肥大化, 複雑化する例 1. 各画面共通の見た目だから、BaseViewController クラスを作成 2. showAlert メソッドを基底クラスに実装 3.

    『 この画面だけアラー トの出し方を変えたい』 by: デザイナー 4. Base クラスの変更に迫られる。 変更時の影響が大 Base クラスに条件分岐を書く Override したサブクラスを作成し、 継承させる Base クラスからshowAlert を剥がす
  12. 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 ) { . . . } / / 実装しないとエラー にな
  13. 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 } }
  14. 使い方 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 : " エラー です" ) }
  15. 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
  16. 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 }
  17. 文字列周りAPI の強化 複数行に渡る文字列 p r i n t ( "

    " " あいうえお かきくけこ さしすせそ たちつてと なにぬねの はひふへほ まみむめも や ゆ よ らりるれろ わ を ん " " " )
  18. 文字列周り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
  19. 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/