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

Swiftへの愛

 Swiftへの愛

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

C0c3e2b792a468590679e46b86e1784d?s=128

hirothings

August 02, 2017
Tweet

More Decks by hirothings

Other Decks in Programming

Transcript

  1. Swift への愛 @hirothings

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

    案件の Swift 試してみる担当 になり、Swift と出会っ た。
  3. Swift との出会い ‑ 最初のタスク 上司: とりあえず、Objective‑C で書いたプロトタイプのコー ドあるか ら、Swift 化してみて

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

  5. Swift 最高

  6. Swift とは Apple が2014 に発表したプログラミング言語 のちオー プンソー ス化(https://github.com/apple/swift) 「 速い,

    モダン, 安全」 アイコンはアマツバメ
  7. Swift のここが好き 1. 静的型付け言語 2. モダンな言語 3. null 安全な言語 4.

    値型中心の言語 5. Protocol + Protocol Extension 6. Generics
  8. 1. 静的型付け言語

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

  10. 2. モダンな言語

  11. 型推論 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 だお"
  12. クロー ジャ 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 } ( )
  13. 高階関数 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 }
  14. パター ンマッチング 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 のパター ンマッチ構文集( ほぼ翻訳) 参照
  15. 3. null 安全な言語

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

  17. 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 型のままだとエラー がでてビルドできない
  18. アンラップ 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 ! "
  19. 4. 値型中心の言語

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

  21. 参照型の問題 コー ドを見ないとどこで参照されて、 どこまでインスタンスが共有され るのか不明 ひろしがさだおになって大事故な例 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 !
  22. 値型 代入時、 値はコピー されるため、 インスタンスは共有されない。 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
  23. 値型中心の言語

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

    Dictionary Bool Int Double Float Swift 実践入門を買いなさい
  25. コピー ごとにコストがかかるのでは?

  26. 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
  27. 5. Protocol + Protocol Extension

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

  29. コー ドが肥大化, 複雑化する例 1. 各画面共通の見た目だから、BaseViewController クラスを作成 2. showAlert メソッドを基底クラスに実装 3.

    『 この画面だけアラー トの出し方を変えたい』 by: デザイナー 4. Base クラスの変更に迫られる。 変更時の影響が大 Base クラスに条件分岐を書く Override したサブクラスを作成し、 継承させる Base クラスからshowAlert を剥がす
  30. Protocol で解決

  31. 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 ) { . . . } / / 実装しないとエラー にな
  32. Protocol Extension

  33. 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 } }
  34. 使い方 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 : " エラー です" ) }
  35. 6. Generics

  36. 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
  37. Swift のここが辛い

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

    実装に時間がかかる( これは慣れの問題かも..)
  39. Swift4

  40. 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 }
  41. 文字列周りAPI の強化 複数行に渡る文字列 p r i n t ( "

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

  45. 先生みたいな存在 型に対して厳しく、 自然とタイプセー フな書き方を指南される 型っていいよねー。 って言えるようになったw モダンな書き方をしようという文化がある 初心者に厳しくも優しい 値型が主なのはとっつきやすい Class

    設計について考えさせられる 自分はPHP チョットデキル程度だったので特に
  46. でもiphone アプリやらないし..

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

  48. Playground さっと書いてすぐコー ドを試せるツー ル。Xcode に標準で入っている 競技プログラミング in Swift 標準入力を受け取るような問題を解いてみる 参考(

    昔書いた記事):[ 改編]Swift を使ってPaiza の問題を解く
  49. Swift 最高 ‑ 完