SlideShare une entreprise Scribd logo
1  sur  25
Swift 2.0
変更点(だいたい)まとめ
Error Handling
Representing and Throwing Errors
// Errorを定義する
enum VendingMachineError: ErrorType {
case InvalidSelection
case InsufficientFunds(coinsNeeded: Int)
case OutOfStock
}
// Errorをthrowする
throw VendingMachineError.InsufficientFunds(coinsNeeded: 5)
Handling Errors
class VendingMachine {
// Errorをthrowするfunctionにはthrowsつける
func vend(name: String, coins: Int) throws -> Int {
guard let item = inventory[name] else {
throw VendingMachineError.InvalidSelection
}
return coins - item.price
}
}
Handling Errors
// Errorを処理しないので、throwsをつけて呼び出し元に任せる
func buyFavoriteSnack(person: String, coins: Int) throws -> Int {
let snackName = favoriteSnacks[person] ?? "Candy Bar"
// Errorをthrowするfunctionの呼び出し元は、tryしないとビルドエラー
return try vendingMachine.vend(snackName, coins: coins)
}
Handling Errors
// Errorをdo – catchで処理する
func buyFavoriteSnack(person: String, coins: Int) -> Int {
let snackName = favoriteSnacks[person] ?? "Candy Bar"
do {
return try vendingMachine.vend(snackName, coins: coins)
} catch VendingMachineError.InvalidSelection {
print("Invalid selection.")
} catch VendingMachineError.InsufficientFunds(let coinsNeeded) {
print("Please insert an additional (coinsNeeded) coins.")
} catch {
print("Unknown Error.")
}
}
Handling Errors
func buyFavoriteSnack(person: String, coins: Int) -> Int {
let snackName = favoriteSnacks[person] ?? "Candy Bar"
// try?にすると、returnがOptionalになる
// Errorのときは、ランタイムエラーにならず、returnがnilになる
return try? vendingMachine.vend(snackName, coins: coins) ?? coins
}
Handling Errors
func buyFavoriteSnack(person: String, coins: Int) -> Int {
let snackName = favoriteSnacks[person] ?? "Candy Bar"
// try!にすると、ビルドエラーは無くなるけど、
// Error発生時にはランタイムエラーになるので危険
return try! vendingMachine.vend(snackName, coins: coins)
}
Specifying Cleanup Actions
func processFile(filename: String) throws {
if exists(filename) {
let file = open(filename)
defer { // 開いたリソースの閉じる処理を近くに書いとく
close(file)
}
while let line = try file.readline() {
// TODO
}
// scope終了時にdeferの中が呼ばれて、リソースが閉じられる
// 同じscopeに複数のdeferを書いたときは、逆順に呼ばれる
}
}
Control Flow
Repeat-While
// do – whileと同じ
// 一回実行してから繰り返し条件を判断する
var num: Int
repeat {
num = random()
} while num < 100
Guard
func vend(name: String, coins: Int) throws -> Int {
// 前提条件検証に特化した条件分岐
// elseまでセットなので、正しい方の条件を書く
// let / varで宣言した変数はguardの外のscopeになる
// elseはreturn, break, continue, throwで抜けないとコンパイルエラー
guard let item = inventory[name] else {
throw VendingMachineError.InvalidSelection
}
return coins - item.price
}
If Case(Pattern Match)
enum Gender {
case Male, Female
}
let person: (String, Int, Gender) = ("Ken", 33, .Male)
// ifとguardでもcaseが使える
if case (_, 20..<65, _) = person {
print("Worker!")
}
if case (let name, _, .Male) = person {
print(name)
}
Optional Pattern
let nums: [Int?] = [nil, 2, 3, nil, 5]
for case let num? in nums { // nilを除いたループ。numはInt?じゃなくてInt
print(num) // 2, 3, 5
}
for case let num? in nums where num % 2 == 1 {
print(num) // 3, 5
}
Checking API Availability
// ランタイムのプラットホームとバージョン(以上)を判定できる
// ifとguardの条件でのみ使える
// プラットホームは、「iOS」「OSX」「watchOS」が使える
// バージョンは、メジャーだけからサブマイナーまで書ける
// 最後の要素は、絶対「*」になる
if #available(iOS 9, OSX 10.10, *) {
// Use iOS 9 APIs on iOS, and use OS X v10.10 APIs on OS X
} else {
// Fall back to earlier iOS and OS X APIs
}
Protocol Extensions
Protocol Extensions
protocol MyProtocol {
func abstractFunc()
func defaultFunc()
}
extension MyProtocol {
// functionのデフォルト実装を書ける
func defaultFunc() { … }
// protocolにないfunctionも書ける(privateもOK)
func newFunc() { … }
}
Protocol Extensions
// extensionで実装したメソッドは実装しなくてもOK
class MyClass: MyProtocol {
func abstractFunc() { … }
}
MyClass().abstractFunc()
MyClass().defaultFunc()
MyClass().newFunc()
class MyClass2: MyProtocol {
func abstractFunc() { … }
func defaultFunc() { … } // extensionのデフォルト実装は上書きできる
func newFunc() { … } // extensionだけに書いたメソッドも上書きできる
}
その他
Enumerations
Implicitly Assigned Raw Values
// 最初の要素を明示しない場合は0になる
// 以降の要素を明示しない場合、直前の要素をインクリメントした値になる
enum Planet: Int {
// 0, 1, 5, 6, 7, 10, 11, 12
case Mercury, Venus, Earth = 5, Mars, Jupiter, Saturn = 10, Uranus, Neptune
}
// 明示しない場合は、名前と同じになる
enum CompassPoint: String {
// "North", "南", "East", "West"
case North, South = "南", East, West
}
Enumerations
Recursive Enumerations
// 自身をネストしたenumが作れる
// ネストするものにindirectをつける
enum ArithmeticExpression {
case Number(Int)
indirect case Addition(ArithmeticExpression, ArithmeticExpression)
indirect case Multiplication(ArithmeticExpression, ArithmeticExpression)
}
// enum自体につけることもできる
indirect enum ArithmeticExpression {
case Number(Int)
case Addition(ArithmeticExpression, ArithmeticExpression)
case Multiplication(ArithmeticExpression, ArithmeticExpression)
}
Expressions
Initializer Expression
class MyClass {
init(i: Int) { … }
init(s: String) { … }
init(i: Int, s: String) { … }
}
// Initializerを取れるようになった
let init1: Int -> MyClass = MyClass.init
let init2: String -> MyClass = MyClass.init
let init3: (Int, String) -> MyClass = MyClass.init
let initializer: Int -> String = String.init
let s: String = [1, 2, 3].map(initializer).reduce("", combine: +) // "123"
Functions
Variadic Parameters
// 可変長引数を末尾以外にも書ける(ただし1つまで)
func print(items: Any..., separator: String = default, terminator: String = default)
print(1, 2, 3, separator: ", ", terminator: ".") // "1, 2, 3."
String Literals
// 文字列リテラルの+演算子での結合は、
// 実行時ではなく、コンパイル時に処理される
// textAとtextBは実行時には同じ
let textA = "Hello " + "world"
let textB = "Hello world"
• Functionのラベルのつけ方が変更になってる
– 第一引数に#つけられなくなった。けど、自由にラ
ベルをつけられる
– 第一引数以外に#をつけると、呼ぶ時にラベル不
要
• Label付きのbreakで、ifとswitchもbreakできる
ようになった

Contenu connexe

Tendances

Visual C++コード分析を支えるSAL
Visual C++コード分析を支えるSALVisual C++コード分析を支えるSAL
Visual C++コード分析を支えるSALegtra
 
可変値変数 var を極力避けることを模索するための事前知識 #cswift
可変値変数 var を極力避けることを模索するための事前知識 #cswift可変値変数 var を極力避けることを模索するための事前知識 #cswift
可変値変数 var を極力避けることを模索するための事前知識 #cswiftTomohiro Kumagai
 
Kanazawa.js.Next
Kanazawa.js.NextKanazawa.js.Next
Kanazawa.js.Nextdynamis
 
Ruby初級者向けレッスン 45回 ─── 例外
Ruby初級者向けレッスン 45回 ─── 例外Ruby初級者向けレッスン 45回 ─── 例外
Ruby初級者向けレッスン 45回 ─── 例外higaki
 
プロトコル指向に想う世界観 #__swift__
プロトコル指向に想う世界観 #__swift__プロトコル指向に想う世界観 #__swift__
プロトコル指向に想う世界観 #__swift__Tomohiro Kumagai
 
90分間濃縮 PHPエラーの教室
90分間濃縮 PHPエラーの教室90分間濃縮 PHPエラーの教室
90分間濃縮 PHPエラーの教室Yusuke Ando
 
SEH on mingw32
SEH on mingw32SEH on mingw32
SEH on mingw32kikairoya
 
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14Ryo Suzuki
 
templateとautoの型推論
templateとautoの型推論templateとautoの型推論
templateとautoの型推論MITSUNARI Shigeo
 
Scalaでの例外処理
Scalaでの例外処理Scalaでの例外処理
Scalaでの例外処理Takashi Kawachi
 
PHPの教室「foreachを極める」
PHPの教室「foreachを極める」PHPの教室「foreachを極める」
PHPの教室「foreachを極める」Yusuke Ando
 
Php in ruby
Php in rubyPhp in ruby
Php in rubydo_aki
 
ちょっと詳しくJavaScript 第4回【スコープとクロージャ】
ちょっと詳しくJavaScript 第4回【スコープとクロージャ】ちょっと詳しくJavaScript 第4回【スコープとクロージャ】
ちょっと詳しくJavaScript 第4回【スコープとクロージャ】株式会社ランチェスター
 
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜勝成 鈴江
 
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第1回 ‟シューティングゲームのプログラム„
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第1回 ‟シューティングゲームのプログラム„【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第1回 ‟シューティングゲームのプログラム„
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第1回 ‟シューティングゲームのプログラム„和弘 井之上
 
プロトコル指向 - 夢と現実の狭間 #cswift
プロトコル指向 - 夢と現実の狭間 #cswiftプロトコル指向 - 夢と現実の狭間 #cswift
プロトコル指向 - 夢と現実の狭間 #cswiftTomohiro Kumagai
 
「Vimrcリーディングに役立ちそうな」vimrcの設定とplugin管理
「Vimrcリーディングに役立ちそうな」vimrcの設定とplugin管理「Vimrcリーディングに役立ちそうな」vimrcの設定とplugin管理
「Vimrcリーディングに役立ちそうな」vimrcの設定とplugin管理gu4
 

Tendances (20)

Visual C++コード分析を支えるSAL
Visual C++コード分析を支えるSALVisual C++コード分析を支えるSAL
Visual C++コード分析を支えるSAL
 
可変値変数 var を極力避けることを模索するための事前知識 #cswift
可変値変数 var を極力避けることを模索するための事前知識 #cswift可変値変数 var を極力避けることを模索するための事前知識 #cswift
可変値変数 var を極力避けることを模索するための事前知識 #cswift
 
Kanazawa.js.Next
Kanazawa.js.NextKanazawa.js.Next
Kanazawa.js.Next
 
Ruby初級者向けレッスン 45回 ─── 例外
Ruby初級者向けレッスン 45回 ─── 例外Ruby初級者向けレッスン 45回 ─── 例外
Ruby初級者向けレッスン 45回 ─── 例外
 
プロトコル指向に想う世界観 #__swift__
プロトコル指向に想う世界観 #__swift__プロトコル指向に想う世界観 #__swift__
プロトコル指向に想う世界観 #__swift__
 
90分間濃縮 PHPエラーの教室
90分間濃縮 PHPエラーの教室90分間濃縮 PHPエラーの教室
90分間濃縮 PHPエラーの教室
 
SEH on mingw32
SEH on mingw32SEH on mingw32
SEH on mingw32
 
20081120 lt11th ace
20081120 lt11th ace20081120 lt11th ace
20081120 lt11th ace
 
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14
 
templateとautoの型推論
templateとautoの型推論templateとautoの型推論
templateとautoの型推論
 
Scalaでの例外処理
Scalaでの例外処理Scalaでの例外処理
Scalaでの例外処理
 
Testman
TestmanTestman
Testman
 
PHPの教室「foreachを極める」
PHPの教室「foreachを極める」PHPの教室「foreachを極める」
PHPの教室「foreachを極める」
 
Php in ruby
Php in rubyPhp in ruby
Php in ruby
 
emc++ chapter32
emc++ chapter32emc++ chapter32
emc++ chapter32
 
ちょっと詳しくJavaScript 第4回【スコープとクロージャ】
ちょっと詳しくJavaScript 第4回【スコープとクロージャ】ちょっと詳しくJavaScript 第4回【スコープとクロージャ】
ちょっと詳しくJavaScript 第4回【スコープとクロージャ】
 
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
 
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第1回 ‟シューティングゲームのプログラム„
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第1回 ‟シューティングゲームのプログラム„【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第1回 ‟シューティングゲームのプログラム„
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第1回 ‟シューティングゲームのプログラム„
 
プロトコル指向 - 夢と現実の狭間 #cswift
プロトコル指向 - 夢と現実の狭間 #cswiftプロトコル指向 - 夢と現実の狭間 #cswift
プロトコル指向 - 夢と現実の狭間 #cswift
 
「Vimrcリーディングに役立ちそうな」vimrcの設定とplugin管理
「Vimrcリーディングに役立ちそうな」vimrcの設定とplugin管理「Vimrcリーディングに役立ちそうな」vimrcの設定とplugin管理
「Vimrcリーディングに役立ちそうな」vimrcの設定とplugin管理
 

Similaire à Swift 2.0 変更点(だいたい)まとめ

Visual C++で使えるC++11
Visual C++で使えるC++11Visual C++で使えるC++11
Visual C++で使えるC++11nekko1119
 
ちょっと詳しくJavaScript 第2回【関数と引数】
ちょっと詳しくJavaScript 第2回【関数と引数】ちょっと詳しくJavaScript 第2回【関数と引数】
ちょっと詳しくJavaScript 第2回【関数と引数】株式会社ランチェスター
 
Swift らしい表現を目指そう #eventdots
Swift らしい表現を目指そう #eventdotsSwift らしい表現を目指そう #eventdots
Swift らしい表現を目指そう #eventdotsTomohiro Kumagai
 
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第4回 ‟関数„
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第4回 ‟関数„【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第4回 ‟関数„
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第4回 ‟関数„和弘 井之上
 
C++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みくださいC++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みくださいdigitalghost
 
Adaptive optimization of JIT compiler
Adaptive optimization of JIT compilerAdaptive optimization of JIT compiler
Adaptive optimization of JIT compilernothingcosmos
 
HoloLensハンズオン:AirTap & SpatialMapping編
HoloLensハンズオン:AirTap & SpatialMapping編HoloLensハンズオン:AirTap & SpatialMapping編
HoloLensハンズオン:AirTap & SpatialMapping編Takashi Yoshinaga
 
iTamabi 13 第7回:ARTSAT API 実践 2 衛星の情報で表現する
iTamabi 13  第7回:ARTSAT API 実践 2 衛星の情報で表現するiTamabi 13  第7回:ARTSAT API 実践 2 衛星の情報で表現する
iTamabi 13 第7回:ARTSAT API 実践 2 衛星の情報で表現するAtsushi Tadokoro
 
東京Node学園#3 Domains & Isolates
東京Node学園#3 Domains & Isolates東京Node学園#3 Domains & Isolates
東京Node学園#3 Domains & Isolateskoichik
 
OnActivityResult - おまえら!もうonActivityResultでswitchとif書く時代は終わりだぞ!
OnActivityResult - おまえら!もうonActivityResultでswitchとif書く時代は終わりだぞ!OnActivityResult - おまえら!もうonActivityResultでswitchとif書く時代は終わりだぞ!
OnActivityResult - おまえら!もうonActivityResultでswitchとif書く時代は終わりだぞ!Shinobu Okano
 
Unit test in android
Unit test in androidUnit test in android
Unit test in androidTatsuya Maki
 
JavaScript.Next
JavaScript.NextJavaScript.Next
JavaScript.Nextdynamis
 
第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」yoshiaki iwanaga
 

Similaire à Swift 2.0 変更点(だいたい)まとめ (17)

Visual C++で使えるC++11
Visual C++で使えるC++11Visual C++で使えるC++11
Visual C++で使えるC++11
 
ちょっと詳しくJavaScript 第2回【関数と引数】
ちょっと詳しくJavaScript 第2回【関数と引数】ちょっと詳しくJavaScript 第2回【関数と引数】
ちょっと詳しくJavaScript 第2回【関数と引数】
 
Swift らしい表現を目指そう #eventdots
Swift らしい表現を目指そう #eventdotsSwift らしい表現を目指そう #eventdots
Swift らしい表現を目指そう #eventdots
 
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第4回 ‟関数„
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第4回 ‟関数„【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第4回 ‟関数„
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第4回 ‟関数„
 
openFrameworks iOS 入門
openFrameworks iOS 入門openFrameworks iOS 入門
openFrameworks iOS 入門
 
C++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みくださいC++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みください
 
Adaptive optimization of JIT compiler
Adaptive optimization of JIT compilerAdaptive optimization of JIT compiler
Adaptive optimization of JIT compiler
 
HoloLensハンズオン:AirTap & SpatialMapping編
HoloLensハンズオン:AirTap & SpatialMapping編HoloLensハンズオン:AirTap & SpatialMapping編
HoloLensハンズオン:AirTap & SpatialMapping編
 
Task
TaskTask
Task
 
iTamabi 13 第7回:ARTSAT API 実践 2 衛星の情報で表現する
iTamabi 13  第7回:ARTSAT API 実践 2 衛星の情報で表現するiTamabi 13  第7回:ARTSAT API 実践 2 衛星の情報で表現する
iTamabi 13 第7回:ARTSAT API 実践 2 衛星の情報で表現する
 
東京Node学園#3 Domains & Isolates
東京Node学園#3 Domains & Isolates東京Node学園#3 Domains & Isolates
東京Node学園#3 Domains & Isolates
 
OnActivityResult - おまえら!もうonActivityResultでswitchとif書く時代は終わりだぞ!
OnActivityResult - おまえら!もうonActivityResultでswitchとif書く時代は終わりだぞ!OnActivityResult - おまえら!もうonActivityResultでswitchとif書く時代は終わりだぞ!
OnActivityResult - おまえら!もうonActivityResultでswitchとif書く時代は終わりだぞ!
 
Unit test in android
Unit test in androidUnit test in android
Unit test in android
 
JavaScript.Next
JavaScript.NextJavaScript.Next
JavaScript.Next
 
第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」
 
Swiftおさらい
SwiftおさらいSwiftおさらい
Swiftおさらい
 
MMIO on VT-x
MMIO on VT-xMMIO on VT-x
MMIO on VT-x
 

Swift 2.0 変更点(だいたい)まとめ

  • 3. Representing and Throwing Errors // Errorを定義する enum VendingMachineError: ErrorType { case InvalidSelection case InsufficientFunds(coinsNeeded: Int) case OutOfStock } // Errorをthrowする throw VendingMachineError.InsufficientFunds(coinsNeeded: 5)
  • 4. Handling Errors class VendingMachine { // Errorをthrowするfunctionにはthrowsつける func vend(name: String, coins: Int) throws -> Int { guard let item = inventory[name] else { throw VendingMachineError.InvalidSelection } return coins - item.price } }
  • 5. Handling Errors // Errorを処理しないので、throwsをつけて呼び出し元に任せる func buyFavoriteSnack(person: String, coins: Int) throws -> Int { let snackName = favoriteSnacks[person] ?? "Candy Bar" // Errorをthrowするfunctionの呼び出し元は、tryしないとビルドエラー return try vendingMachine.vend(snackName, coins: coins) }
  • 6. Handling Errors // Errorをdo – catchで処理する func buyFavoriteSnack(person: String, coins: Int) -> Int { let snackName = favoriteSnacks[person] ?? "Candy Bar" do { return try vendingMachine.vend(snackName, coins: coins) } catch VendingMachineError.InvalidSelection { print("Invalid selection.") } catch VendingMachineError.InsufficientFunds(let coinsNeeded) { print("Please insert an additional (coinsNeeded) coins.") } catch { print("Unknown Error.") } }
  • 7. Handling Errors func buyFavoriteSnack(person: String, coins: Int) -> Int { let snackName = favoriteSnacks[person] ?? "Candy Bar" // try?にすると、returnがOptionalになる // Errorのときは、ランタイムエラーにならず、returnがnilになる return try? vendingMachine.vend(snackName, coins: coins) ?? coins }
  • 8. Handling Errors func buyFavoriteSnack(person: String, coins: Int) -> Int { let snackName = favoriteSnacks[person] ?? "Candy Bar" // try!にすると、ビルドエラーは無くなるけど、 // Error発生時にはランタイムエラーになるので危険 return try! vendingMachine.vend(snackName, coins: coins) }
  • 9. Specifying Cleanup Actions func processFile(filename: String) throws { if exists(filename) { let file = open(filename) defer { // 開いたリソースの閉じる処理を近くに書いとく close(file) } while let line = try file.readline() { // TODO } // scope終了時にdeferの中が呼ばれて、リソースが閉じられる // 同じscopeに複数のdeferを書いたときは、逆順に呼ばれる } }
  • 11. Repeat-While // do – whileと同じ // 一回実行してから繰り返し条件を判断する var num: Int repeat { num = random() } while num < 100
  • 12. Guard func vend(name: String, coins: Int) throws -> Int { // 前提条件検証に特化した条件分岐 // elseまでセットなので、正しい方の条件を書く // let / varで宣言した変数はguardの外のscopeになる // elseはreturn, break, continue, throwで抜けないとコンパイルエラー guard let item = inventory[name] else { throw VendingMachineError.InvalidSelection } return coins - item.price }
  • 13. If Case(Pattern Match) enum Gender { case Male, Female } let person: (String, Int, Gender) = ("Ken", 33, .Male) // ifとguardでもcaseが使える if case (_, 20..<65, _) = person { print("Worker!") } if case (let name, _, .Male) = person { print(name) }
  • 14. Optional Pattern let nums: [Int?] = [nil, 2, 3, nil, 5] for case let num? in nums { // nilを除いたループ。numはInt?じゃなくてInt print(num) // 2, 3, 5 } for case let num? in nums where num % 2 == 1 { print(num) // 3, 5 }
  • 15. Checking API Availability // ランタイムのプラットホームとバージョン(以上)を判定できる // ifとguardの条件でのみ使える // プラットホームは、「iOS」「OSX」「watchOS」が使える // バージョンは、メジャーだけからサブマイナーまで書ける // 最後の要素は、絶対「*」になる if #available(iOS 9, OSX 10.10, *) { // Use iOS 9 APIs on iOS, and use OS X v10.10 APIs on OS X } else { // Fall back to earlier iOS and OS X APIs }
  • 17. Protocol Extensions protocol MyProtocol { func abstractFunc() func defaultFunc() } extension MyProtocol { // functionのデフォルト実装を書ける func defaultFunc() { … } // protocolにないfunctionも書ける(privateもOK) func newFunc() { … } }
  • 18. Protocol Extensions // extensionで実装したメソッドは実装しなくてもOK class MyClass: MyProtocol { func abstractFunc() { … } } MyClass().abstractFunc() MyClass().defaultFunc() MyClass().newFunc() class MyClass2: MyProtocol { func abstractFunc() { … } func defaultFunc() { … } // extensionのデフォルト実装は上書きできる func newFunc() { … } // extensionだけに書いたメソッドも上書きできる }
  • 20. Enumerations Implicitly Assigned Raw Values // 最初の要素を明示しない場合は0になる // 以降の要素を明示しない場合、直前の要素をインクリメントした値になる enum Planet: Int { // 0, 1, 5, 6, 7, 10, 11, 12 case Mercury, Venus, Earth = 5, Mars, Jupiter, Saturn = 10, Uranus, Neptune } // 明示しない場合は、名前と同じになる enum CompassPoint: String { // "North", "南", "East", "West" case North, South = "南", East, West }
  • 21. Enumerations Recursive Enumerations // 自身をネストしたenumが作れる // ネストするものにindirectをつける enum ArithmeticExpression { case Number(Int) indirect case Addition(ArithmeticExpression, ArithmeticExpression) indirect case Multiplication(ArithmeticExpression, ArithmeticExpression) } // enum自体につけることもできる indirect enum ArithmeticExpression { case Number(Int) case Addition(ArithmeticExpression, ArithmeticExpression) case Multiplication(ArithmeticExpression, ArithmeticExpression) }
  • 22. Expressions Initializer Expression class MyClass { init(i: Int) { … } init(s: String) { … } init(i: Int, s: String) { … } } // Initializerを取れるようになった let init1: Int -> MyClass = MyClass.init let init2: String -> MyClass = MyClass.init let init3: (Int, String) -> MyClass = MyClass.init let initializer: Int -> String = String.init let s: String = [1, 2, 3].map(initializer).reduce("", combine: +) // "123"
  • 23. Functions Variadic Parameters // 可変長引数を末尾以外にも書ける(ただし1つまで) func print(items: Any..., separator: String = default, terminator: String = default) print(1, 2, 3, separator: ", ", terminator: ".") // "1, 2, 3."
  • 24. String Literals // 文字列リテラルの+演算子での結合は、 // 実行時ではなく、コンパイル時に処理される // textAとtextBは実行時には同じ let textA = "Hello " + "world" let textB = "Hello world"
  • 25. • Functionのラベルのつけ方が変更になってる – 第一引数に#つけられなくなった。けど、自由にラ ベルをつけられる – 第一引数以外に#をつけると、呼ぶ時にラベル不 要 • Label付きのbreakで、ifとswitchもbreakできる ようになった