狠狠撸

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

More Related Content

颈翱厂エンシ?ニアのための厂肠补濒补入门