Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

iOSエンジニアのためのScala入門

3,645 views

Published on

Scala関西2017の発表資料

Published in: Internet
  • Be the first to comment

iOSエンジニアのためのScala入門

  1. 1. iOSエンジニアのための Scala入門 (あるいはScalaエンジニア のためのSwift入門) 株式会社セプテーニ・オリジナル 嶽 雅也
  2. 2. アジェンダ • 自己紹介 • はじめに • 言語の概要 • 言語共通の特徴/文法 • 自分がどちらの言語も使っていて思うこと • 今後の学習を続けるために • 最後に • 引用元及び参考書籍
  3. 3. 自己紹介 #1 • 株式会社セプテーニ・オリジナルの嶽 雅也(だけ まさや)です。Twitterアカウントは @masayadk1229です。 • 昨年の8月に転職して、「GANMA!」というオリジ ナル漫画配信アプリの開発に携わっています。 • 転職前はJavaで4年間開発していて、転職してから Scalaで開発しており、最近ではSwiftでも開発する ようになりました。
  4. 4. 自己紹介 #2 • 先日の「JJUG 2017 Spring」では、「グラフデータベース入門」と いうテーマで発表しました。 • グラフデータベース入門 • 9/16(土)には、「iOSDC JAPAN 2017」で次のテーマで発表します。 「動画コンテンツにおいて、バックグラウンドの音声との制御でつま づいたところ 」 • 本日、皆さんのお手元にあるセプテーニ・オリジナルの技術読本でも 次の内容で記事を書いているので、お時間ある際にご覧下さい。 「末尾再帰の呼び出し最適化の有無によるScalaコンパイラの挙動」
  5. 5. 弊社のカフェスペースを利用して、お酒や食事をし ながら行う勉強会を継続的に実施するコミュニティ Scala, DDD, Android, iOS, アーキテクチャetc…
  6. 6. 第2回が今週終わり、再来週に 第3回があります! • 第2回は元Lightbendで現在スターバックス社のJamie Allenさんや書籍「DeepLearning4j」の著者のAdamさ んなどに発表していただきました! • 参加レポートはこちら • 第3回は、9/19(火)に分析基盤 Meetupを予定していま すので、東京にお越しの際はぜひご参加ください。 • 新宿Geek Lounge#3 分析基盤 Meetup
  7. 7. はじめに • 「Swift実践入門」という書籍をベースにiOSエン ジニアの方が理解しやすい形でScalaを初心者向 けに紹介していきます。 • わかりやすさを優先するため、厳密な定義に則 っていない説明の仕方にしている箇所がありま す。 • 内容的にはクイックツアー的に文法を横断して いきます。
  8. 8. まず、最初に質問させ てください。
  9. 9. この中でSwiftで開発を 行ったことある方?
  10. 10. この中でScalaで開発 を行ったことある方?
  11. 11. この中でSwiftとScala両方 で開発を行ったことある方 ?
  12. 12. 言語の概要
  13. 13. Swiftの概要 • Swiftは、iOS、macOS向けアプリケーションの 開発言語としてAppleが 2014 年に発表したプロ グラミング言語です。 • 2015年12月にオープンソース化され、Linuxでの 実行環境も提供されました。 • 2017年9月現在ではバージョンは3.1になってお り、本資料ではこちらを用います。
  14. 14. Scalaの概要 • Scalaは2003年にスイス連邦工科大学ローザンヌ 校(EPFL)のMartin Odersky教授によって開発 されたプログラミング言語です。 • 処理系はJVM上で動作します。 • 2017年9月現在ではバージョンは2.12.3になって おり、本資料ではこちらを用います。
  15. 15. 言語共通の特徴/文法
  16. 16. Scala/Swift 共通の特徴 • 静的型付き言語 • nilの許容性をコントロール可能 • 型推論による簡潔な記述
  17. 17. Scala/Swift 共通の特徴 • 静的型付き言語 • nilの許容性をコントロール可能 • 型推論による簡潔な記述
  18. 18. 静的型付き言語 #1 • 静的型付き言語は、すべての変数と定数の型は コンパイル時に決定されます。 • 一度決定された変数の型は変更できず、ほかの 型の値を代入することはできません。
  19. 19. 静的型付き言語 #2 • 変数定義はSwift、Scalaともにvar宣言で す。 //Swift var a: Int = 456 a = “abc”//コンパイルエラー //Scala var a: Int = 456 a = "abc"//コンパイルエラー
  20. 20. Scala/Swift 共通の特徴 • 静的型付き言語 • nilの許容性をコントロール可能 • 型推論による簡潔な記述
  21. 21. nilの許容性をコントロール可能 #1 • Swiftではnil、ScalaではNoneが値が存在しないことを示すものです 。 • 多くのプログラミング言語で、変数や定数の初期化が済んでいない 状態や、参照先が存在しない状態を表す値として活用されてきまし た。 • 一方で、初期化されていない値や参照先が存在しない値へのアクセ スによる実行時エラーを招いてしまうという問題もありました • そのような問題を回避するため、基本的な型では変数や定数にSwift ではnil、ScalaではNoneが代入できない仕様となっています。
  22. 22. nilの許容性をコントロール可能 #2 • Swiftでnilを許容する型は Optional<Wrapped>型、ScalaではNoneを許容 する型はOption型です • Optional<Wrapped>型はWrappedにIntなどの具体的な型を入れて Optional<Int>のようにして使用します。Option型も同様です • SwiftはInt型がnilを許容しない型であるのに対し、Optional<Int>型はnilと Int型の値の両方を許容する型となっています。 • Optional<Int>型はシンタックスシュガーであるInt?と書く方が一般的です 。 • ScalaはInt型がNoneを許容しない型であるのに対し、Option[Int]型はNone を許容する型となっており、Int型は代入できません。
  23. 23. nilの許容性をコントロール可能 #3 • 定数定義はSwiftだとlet、Scalaだとval宣言です。 //Scala val a: Option[Int] = None val b: Option[Int] = 3 //コンパイルエラー val c: Int = None //コンパイルエラー //Swift let a: Int? = nil let b: Int? = 3 let c: Int = nil //コンパイルエラー
  24. 24. Scala/Swift 共通の特徴 • 静的型付き言語 • nilの許容性をコントロール可能 • 型推論による簡潔な記述
  25. 25. 型推論による簡潔な記述 #1 • ScalaやSwiftには型推論というしくみ が導入されているため、代入する値な どからコンパイラが型を推測できる場 合は、宣言時にその型を明示する必要 はありません。
  26. 26. 型推論による簡潔な記述 #2 //Swift let a = 123 //Int型 let b = "abc" //String型 //Scala val a = 123 //Int型 val b = "abc" //String型
  27. 27. 言語共通の文法を紹介してい きますが、少し記法が違うも のを中心に取り扱っていきま す。
  28. 28. 言語共通の特徴/文法
  29. 29. Scala/Swift 共通の文法 • 関数の定義 • 文字列埋め込み • 範囲型 • Option型/Optional型からの値の取り出し • プレースホルダー
  30. 30. Scala/Swift 共通の文法 • 関数の定義 • 文字列埋め込み • 範囲型 • Option型/Optional型からの値の取り出し • プレースホルダー
  31. 31. 関数の定義 #1 //Swift //Scala
  32. 32. 関数の定義 #2 //Swift func plus(x: Int, y: Int) -> Int { return x + y }//returnが必要 plus(x: 1, y: 2) //呼び出す際に引数名を記述する必要があります。 //Scala def plus(x: Int, y: Int): Int = x + y //returnが不要 plus(1, 2)
  33. 33. Scala/Swift 共通の文法 • 関数の定義 • 文字列埋め込み • 範囲型 • Option型/Optional型からの値の取り出し • プレースホルダー
  34. 34. 文字列埋め込み //Swift let name = "James" print("Hello, (name)") // Hello, James //Scala val name = "James" println(s"Hello, $name") // Hello, James
  35. 35. Scala/Swift 共通の文法 • 関数の定義 • 文字列埋め込み • 範囲型 • Option型/Optional型からの値の取り出し • プレースホルダー
  36. 36. 範囲型 Swift #1 • Swiftでは 範囲型には、Range<Bound> 型、CountableRange<Bound> 型、 ClosedRange <Bound> 型、CountableClosedRange<Bound> 型の4種があ ります。 • これら4つの型は、半開区間か閉区間かと、カウント可能か不可能かの組み 合わせに応じて使い分けられており、組み合わせと型の対応関係は以下の表 のようになっています。 範囲型 区間 カウント可能 Range<Bound> 半開区間 不可能 CountableRange<Bound> 半開区間 可能 ClosedRange<Bound> 閉区間 不可能 CountableClosedRange<Bound> 閉区間 可能
  37. 37. 範囲型 Swift #2 let range1:CountableRange = 1..<4 //半開区間 for value in range1 { print(value) }//1,2,3 let range2:CountableClosedRange = 1...4 //閉区間 for value in range2 { print(value) }//1,2,3,4
  38. 38. 範囲型 Swift #3 let range3:Range = 1.1..<4.0 let range4:ClosedRange = 1.1…4.0 //Coutableではない for value in range3 { print(value) }//コンパイルエラー
  39. 39. 範囲型 Scala #1 • Scalaでは 範囲型には、Range<T> 型、Range.Inclusive<T> 型、 Range.Partial<T, NumericRange[T]> 型の3種があります • これら3つの型は、Swiftの時と同様に分類すると、以下のように なります。 範囲型 区間 カウント可能 Range.Partial<T, NumericRange[T]> 半開区間 不可能 Range<T> 半開区間 可能 Range.Partial<T, NumericRange[T]> 閉区間 不可能 Range.Inclusive<T> 閉区間 可能
  40. 40. 範囲型 Scala #2 val range1:Range = 1 until 4 //半開区間 for (i <- range1) { println(i) }//1,2,3 val range2:Range.Inclusive = 1 to 4 //閉区間 for (i <- range2) { println(i) }//1,2,3,4
  41. 41. 範囲型 Scala #3 val range3 :Range.Partial[Double,scala.colle ction.immutable.NumericRange[Doub le]] = 1.1 until 4.0 //Coutableではない for (i <- range3) { println(i) }//コンパイルエラー
  42. 42. Scala/Swift 共通の文法 • 関数の定義 • 文字列埋め込み • 範囲型 • Option型/Optional型からの値の取り出し • プレースホルダー
  43. 43. Option型/Optional型からの値の取り出し Swift #1 • SwiftではOptionからの値の取り出し方に は以下の3つの代表的なものがあります。 • オプショナルバインディング • ??演算子 • 強制アンラップ
  44. 44. Option型/Optional型からの値の取り出し Swift #2 //オプショナルバインディング //値が存在すれば、ブロック内で値を取り出せる let optionalStr: String? = Optional("Hello") if let a = optionalStr { print(a) } //Hello let optionalStr2: String? = nil if let b = optionalStr2 { print(b) } //表示されない
  45. 45. Option型/Optional型からの値の取り出し Swift #3 //??演算子 //(Optional ?? default値) let optionalInt: Int? = 1 print(optionalInt ?? 3) // 1 let optionalInt2: Int? = nil print(optionalInt2 ?? 3) // 3
  46. 46. Option型/Optional型からの値の取り出し Swift #4 //強制アンラップ //変数の後ろに!マークをつける let a: Int? = 1 let b: Int? = 1 let c: Int? = nil print(a + b) //コンパイルエラー print(a! + b!) // 2 print(c!) //実行時エラー
  47. 47. Option型/Optional型からの値の取り出し Scala #1 • Scalaでもいくつか値の取り出し方法はあるので すが、Swiftの例に合わせると以下のようになるか と思います。 • オプショナルバインディング→Option.foreach • ??演算子→Option.getOrElse • 強制アンラップ→Option.get
  48. 48. Option型/Optional型からの値の取り出し Scala #2 //Option.foreach //値が存在すれば、ブロック内で値を取り出せる val optionalStr: Option[String] = Some("Hello") optionalStr.foreach(x => println(x)) //Hello val optionalStr2: Option[String] = None optionalStr2.foreach(x => println(x)) //表示されない
  49. 49. Option型/Optional型からの値の取り出し Scala #3 //Option.getOrElse //getOrElse(デフォルト値) val optionalInt: Option[Int] = Some(1) print(optionalInt.getOrElse(3))//1 val optionalInt2: Option[Int] = None print(optionalInt2.getOrElse(3))//3
  50. 50. Option型/Optional型からの値の取り出し Scala #4 //Option.get val a: Option[Int] = Some(1) val b: Option[Int] = Some(1) val c: Option[Int] = None print(a + b) //コンパイルエラー print(a.get + b.get) // 2 print(c.get) //実行時エラー
  51. 51. Scala/Swift 共通の文法 • 関数の定義 • 文字列埋め込み • 範囲型 • Option型/Optional型からの値の取り出し • プレースホルダー
  52. 52. プレースホルダー //Swift [1,2,3].map{$0+1} //2,3,4 //Scala List(1,2,3).map(_+1) //2,3,4
  53. 53. 自分がどちらの言語も 使っていて思うこと
  54. 54. Swiftの好きなところ • guard構文便利! • プロパティ監視便利! • プロトコル指向によって、クラス 階層が深くならない!
  55. 55. Swiftの辛いところ • Scalaに比べて、Swiftにコレクショ ンメソッド少なくてしんどい • Xcode問題(リファクタリング機能な い、コンパイル遅い etc)でしんどい • 文字列APIが扱いづらくてしんどい
  56. 56. Swiftの辛いところ • Scalaに比べて、Swiftにコレクションメソッド少な くてしんどい→Swiftのコレクションを拡張する。 • Xcode問題(リファクタリング機能ない、コンパイ ル遅い etc)でしんどい →補助的にAppCodeを使用。 • 文字列APIが扱いづらくてしんどい →なぜSwiftの文字列APIは難しいのか
  57. 57. Scalaの好きなところ • 非同期処理でFuture便利! • コレクションメソッドが多く、直 感的に記述しやすい! • パターンマッチが強力で扱いやす い!
  58. 58. Scalaの辛いところ • 書くときに型合わせがしんどい • 省略ルールなどがたくさんあり、 理解しづらい時があってしんどい • FPの知識がないと読めなくてしん どい
  59. 59. Scalaの辛いところ • 書くときに型合わせがしんどい →精進あるのみ • 省略ルールなどがたくさんあり、理解しづらい時 があってしんどい →少しずつ経験値を高めていくのみ • FPの知識がないと読めない時があってしんどい →FPの知識を身につけていくことで簡潔な記述が できるようになるので、チャレンジしていきたい !
  60. 60. 今後の学習を続けるために
  61. 61. まずは触ってみるために • Swift(というかiOS開発) • 株式会社はてな様の研修用教科書 • Swift • iOSアプリ開発 • 株式会社ミクシィ様のエンジニア向け資料 • Scala • 株式会社はてな様の研修用教科書 • 株式会社ドワンゴ様の新卒エンジニア向け資料
  62. 62. 最後に
  63. 63. 最後に • 時間の関係上、あまり深くまでは触れられませ んでしたが、Scala、Swiftが比較した上で最初の 入門はできたかと思います。 • この資料が少しでも皆さんの学びの第一歩とな れば幸いです。
  64. 64. 引用元及び参考書籍 • Scalaスケーラブルプログラミング第3版 • Swift実践入門 直感的な文法と安全性を兼ね備え た言語

×