SlideShare a Scribd company logo
1 of 80
Download to read offline
EZ-‐‑‒NET  熊⾕谷友宏  
http://ez-‐‑‒net.jp/
2015.07.25  
@  カジュアル  Swift  勉強会  #1
Swift  2.0  で変わったところ
Swift  カジュアルプログラミング
(前編)
熊谷友宏
EZ-NET http://ez-net.jp/
@es_kumagai
Xcode 5 徹底解説
IP Phone 音でダイヤル 音で再配達ゴッド
いつもの電卓
with 割勘ウォッチ
MOSA
̶ 勉強会開催 ̶
#yidev 横浜 iPhone 開発者勉強会
カジュアル Swift 勉強会 @ 青葉台
新言語 Swift 登場
2014.06.02 @ WWDC 2014
Swift 2.0 登場
2015.06.08 @ WWDC 2015
大幅な仕様変更
?
そこで
Swift 2.0 で変わったところを
ざっくり紹介してみる
制御構文
1/4
guard
▶ 以降、条件式を満たすことを保証
▶ 満たさなければスコープの終了を保証
▶ 早期 Exit
guard《予防線》
guard expression else {
// 条件を満たさない場合は

// ここでスコープを抜ける実装を書く
}
// これ以降は条件を満たしていることを保証
早期 Exit を保証
guard
guard value != 0 else {
// ここでスコープを抜けるコードを書かないとエラー
}
'guard' body may not fall through, consider
using 'return' or 'break' to exit the scope
▶ return
▶ break
▶ continue
▶ fatalError
変数が 0 以外であることを保証
guard
guard value2 != 0 else {
// 0 の場合は結果を 0 とみなす
return 0
}
// これ以降は 0 ではないこと前提で記載できる
return value1 / value2
変数が nil でないことを保証
guard
guard let value = optional else {
// nil の場合は結果を .Unknown とする
return .Unknown
}
// これ以降は value を使ってコーディングできる
let data = calculate(value)
複雑な条件を指定して保証
guard
guard let path = getPath()
where path.hasPrefix("/Volumes") else {
fatalError()
}
// 変数 path が "/Volumes" で始まることを保証
defer
▶ スコープを抜ける直前に実行する
▶ defer の内部で

直前までに宣言された変数が使える
defer《繰り延べ》
defer {
// スコープを抜ける寸前に実行したい処理を記載
}
スコープを抜ける直前に実行
defer
var handle:Handle = File.open(path)
// 最後に必ずリソースを閉じる
defer {
handle.close()
}
// スコープを抜けない限りはリソースを使える
string.writeTo(&handle)
複数の defer を実行
defer
defer {
print(1)
}
defer {
print(2)
}
▶ 最後にスタック順に実行

2 → 1
入れ子にして defer を実行
defer
defer {
defer {
print(1)
}
print(2)
}
▶ defer を抜ける直前で実行

2 → 1
複数呼び出しと入れ子の複合
defer
defer {
defer {
print(1)
}
print(2)
}
defer {
print(3)
}
▶ ルールどおりの順序

3 → 2 → 1
repeat-while
▶ ブロックを実行し、最後に条件判定
▶ 従前の do-while 構文
▶ 条件式は repeat ブロックの外の扱い
repeat-while《繰り返し》
repeat {
// 処理を書く

// この処理を実行後に条件判定
} while expression
実行後に条件判定
repeat-while
var count = 100
repeat {
// 先にブロックを実行
--count
} while count > 0 // ブロックを抜けて条件判定
スコープ内の変数は使えない
repeat-while
let value = 100
repeat {
// while 条件式はスコープの外
let condition = array.contains(value)
} while condition // repeat 内の変数は使えない
Use of unresolved identifier 'condition'
repeat-while の
使いどころが想像できない
上⼿手な
do-catch
▶ エラーハンドリング専用構文
▶ 投げられた ErrorType を捕捉
▶ ErrorType は列挙型または NSError
do-catch《エラーハンドリング》
do {
// エラーが発生する可能性のあるコードを記載

} catch {
// ここでエラー処理を行う
}
エラーの発生と捕捉
do-catch
do {
// エラーが発生するポイントで try を明記
var handle = try File.open(path)
// エラーがなければスコープ内の処理を続行
} catch {
// エラー発生時のみ実行

// ErrorType 型の error 変数を参照可能
print(error)
}
Error Handling
2/4
Error Handling
エラーの定義方法
Error Handling
// 列挙型でエラーを定義
enum FileOperationError : ErrorType {
case FailedToOpen
case NotPermitted(String)
}
▶ 列挙型を ErrorType に準拠
▶ 列挙型がエラードメイン
▶ 列挙子で関連するエラーを定義する
エラーの送出方法
Error Handling
// 列挙子を指定してエラー送信
throw FileOperationError.FailedToOpen
// NSError でエラーを送信
throw NSError(domain:
NSInvalidArgumentException,
code: 0, userInfo: nil)
エラーを詳しく捕捉
Error Handling
do {
var handle = try File.open(path)
} catch FileOperationError.FailedToOpen {
// エラーの種類を明記して捕捉
} catch {
// すべてのエラーの捕捉も必須
}
値付きのエラーを捕捉
Error Handling
do {
var handle = try File.open(path)
} catch FileOperationError
.NotPermitted(let reason) {
// 列挙子に添えられた値を取り出して使える
} catch {
// すべてのエラーの捕捉も必須
}
エラーを大雑把に捕捉(詳細を変数で捕捉)
Error Handling
do {
var handle = try File.open(path)
} catch let error as FileOperationError {
// 列挙型全体で捕捉
} catch {
// すべてのエラーの捕捉も必須
}
エラーを大雑把に捕捉(詳細を破棄)
Error Handling
do {
var handle = try File.open(path)
} catch is FileOperationError {
// 列挙型全体で捕捉
} catch {
// すべてのエラーの捕捉も必須
}
スコープ内で投げたエラーも捕捉可能
Error Handling
do {
// スコープ内で明示的に投げたエラーも捕捉可能
throw FileOperationError.FailedToOpen
} catch FileOperationError.FailedToOpen {
// エラー処理が実行される
}
NSError Handing
ErrorType は NSError にキャスト可能
NSError Handling
let error
= FileOperationError.FailedToOpen as NSError
▶ Error Domain は列挙型名
▶ Error Code は 0
▶ Description は

The operation couldnt be completed. (…)
捕捉時に NSError に変換可能
NSError Handling
do {
var handle = try File.open(path)
} catch let error as NSError {
// NSError と一緒に扱える
print(error.localizedDescription)
}
エラーの扱い
エラーが起こり得ないなら
エラーの扱い
do {
var handle = try! File.open(path)
} catch {
}
▶ エラーが起こり得ないなら try!
▶ do-catch が不要
▶ もしエラーが発生すると強制終了
呼び出し元にエラー処理を委ねる
エラーの扱い
// 引数リストの次に throws を記載
func execute() throws -> String {
// 捕捉しないエラーを呼び出し元へ throw する
var handle = try File.open(path)
}
エラーの一部を呼び出し元に委ねる
エラーの扱い
func execute() throws -> String {
// エラーの一部を捕捉する
do {
var handle = try File.open(path)
}
catch FileOperationError.NotPermitted {
}
// 捕捉しなかったエラーは呼び出し元に委ねる
}
引数でエラーを発生するかを決める
エラーの扱い
// エラーが起こり得る関数を引数にとり

// 関数リストの後に rethrows を明記
func execute(f:() throws -> Void) rethrows
-> String {
try f()
// 受け取った関数以外でエラーは発生できない
}
引数でエラーを発生するかを決める
エラーの扱い
// エラーが起こり得る関数を引数にとり

// 関数リストの後に rethrows を明記
func execute(f:() throws -> Void) rethrows
-> String {
try f()
// 受け取った関数以外でエラーは発生できない
throw FileOperationError.FailedToOpen
}
'rethrows' function may only throw by
calling a parameter function
引数でエラーが発生するかが決まる
エラーの扱い
// エラーが発生するかもしれない関数を渡せる
// その場合は try が必要になる
try execute { () throws -> Void in
}
// エラーが発生しない関数も渡せる
// その場合は try が不要(エラーが起こり得ない)
execute { () -> Void in
}
rethrows 指定の関数に限り好きな方を渡せる
詳細な条件指定
3/4
Pattern Matching
列挙子を扱う(前提)
Pattern Matching
// このような場面を想定したとき
enum Platform {
case IOS(Double)
case OSX(Double)
}
let platform = Platform.OSX(10.11)
if 文で列挙子を判定
Pattern Matching
// 列挙子から直接、添えた値を抽出可能
if case .OSX = platform {
}
列挙子に添えた値を抽出
Pattern Matching
// 列挙子から直接、添えた値を抽出可能
if case let .OSX(version) = platform {
print(version)
}
オプショナルから値を抽出
Pattern Matching
// 意味的には Optional Binding と同等
if case let value? = optional {
print(value)
}
複数のオプショナルから値を抽出
Pattern Matching
// タプルを使ってまとめて変換が可能
if case let (a?, b?, c?)
= (optionalA, optionalB, optionalC) {
// すべてが nil でない場合に限り処理される
print("(a), (b), (c)")
}
値が範囲に含まれるか判定
Pattern Matching
// たとえば数値
if case 0 ..< 100 = value {
print("contains")
}
// たとえば文字列
if case "A" ..< "G" = string {
print("contains")
}
条件指定
if 文に where で条件を添える
条件指定
// Swift 1.2 でも使えた記載方法
if let string = optionalString
where string.hasSuffix(".png") {
}
パターンマッチとの併用も可能
条件指定
// 列挙子から値を抽出して条件判定
if case let .OSX(version) = platform
where version > 10.10 {
}
// 複数のオプショナルを展開して条件判定
if case let (a?, b?, c?)
= (optionalA, optionalB, optionalC)
where a + b == c {
}
guard でも使える
条件指定
// 列挙子から値を抽出して条件判定
guard case let .OSX(version) = platform
where version > 10.10 else {
}
// 複数のオプショナルを展開して条件判定
guard case let (a?, b?, c?)
= (optionalA, optionalB, optionalC)
where a + b == c else {
}
for でも使える
条件指定
// nil 以外の要素で繰り返し
let optionals:[Int?]
for case let value? in optionals {
}
▶ ループの中で判定しなくて良い
▶ fratMap { $0 } でループさせなくて良い
for でも使える
条件指定
// nil 以外の繰り返しに条件まで付けられる
let optionals:[Int?]
for case let value? in optionals
where value > 0 {
}
▶ 該当した要素だけが繰り返しの対象に
Extension
4/4
Protocol Extension
▶ プロトコルに既定の実装を添える仕組み
▶ 型エイリアスで実装条件を絞れる
Protocol Extension
extension Protocol {
func doSomething() {
// ここに実装を記載できる
}
}
既定の実装
Protocol Extension
extension CollectionType {
var count:Index.Distance {
return distance(
self.startIndex, self.endIndex)
}
}
▶ プロトコルで決められた機能で

実装を組み立てる
条件付きで拡張
Protocol Extension
extension CollectionType
where Generator.Element : IntegerType {
var sum:Generator.Element {
return self.reduce(0, combine: +)
}
}
▶ 型エイリアスをプロトコルで縛ると

それを想定した機能が使える
▶ 条件を満たす型だけに実装される
複数の条件で縛る
Protocol Extension
extension CollectionType where
Index : Streamable,
Generator.Element : IntegerType {
func printIndexOf<S:OutputStreamType>
(element:Generator.Element,
inout to stream:S) {
self.indexOf(element)?.writeTo(&stream)
}
}
同じ型であることを明記
Protocol Extension
extension CollectionType where
Generator.Element : IntegerType,
Index.Distance == Generator.Element {
var average:Generator.Element {
return self.reduce(0) { $0 + $1 } / self.count
}
var count:Index.Distance {
return distance(
self.startIndex, self.endIndex)
}
}
自分自身を条件で縛る
Protocol Extension
extension CollectionType where
Self : Equatable,
Self : NillLiteralConvertible {
var isNull:Bool {
return self == nil
}
}
明示的に型で縛る
Protocol Extension
extension CollectionType where
Generator.Element == String {
var lastPathComponents:String {
return self.map { $0.lastPathComponent }
}
}
既定の実装は上書き可能
Protocol Extension
extension MyProtocol {
var isValid:Bool {
return false
}
}
struct MyStruct : MyProtocol {
var isValid:Bool {
return true
}
}
採⽤用
継承して上書き可能
Protocol Extension
protocol MyProtoA {
}
protocol MyProtoB : MyProtoA {
}
extension MyProtoA {
func action() -> Int {
}
}
extension MyProtoB {
func action() -> Int {
}
}
採⽤用
親を呼ぶ、みたいなことはできない
Protocol Extension
extension MyProtoA {
func action() -> Int {
}
}
extension MyProtoB {
func action() -> Int {
return super.action()
}
}
'super' cannot be used outside of class members
キャストで呼び出し先を明記可能
Protocol Extension
extension MyProtoA {
func action() -> Int {
}
}
extension MyProtoB {
func action() -> Int {
return (self as MyProtoA).action() + 1
}
}
Type Extension
▶ 従来からある型の拡張方法
▶ Swift 2 から

ジェネリックパラメータで条件を絞れる
Type Extension
extension Array where Element : IntegerType {
func doSomething() {
}
}
条件をプロトコルで縛る
Type Extension
extension Optional where T : SignedNumberType {
var negative:Optional {
return self.map { -$0 }
}
}
型では縛れない
Type Extension
extension Optional where T == String {
}
Same-type requirement makes
generic parameter 'T' non-generic
型の拡張は 既定の実装 ではない
Type Extension
extension MyStruct {
var isValid:Bool {
return false
}
}
struct MyStruct {
var isValid:Bool {
return true
}
}
おさらい
Invalid redeclaration of 'isValid'
後編
Coming Soon ?
Swift 2.0 で変わったところ(前編)
▶ 制御構文
▶ Error Handling
▶ 詳細な条件指定
▶ Extension

More Related Content

What's hot

Swift の可変値と不変値 #cocoa_kansai
Swift の可変値と不変値 #cocoa_kansaiSwift の可変値と不変値 #cocoa_kansai
Swift の可変値と不変値 #cocoa_kansai
Tomohiro Kumagai
 
メタプログラミングRubyはこの付録が美味しい
メタプログラミングRubyはこの付録が美味しいメタプログラミングRubyはこの付録が美味しい
メタプログラミングRubyはこの付録が美味しい
Shigeru UCHIYAMA
 

What's hot (20)

Swift 2.0 変更点(だいたい)まとめ
Swift 2.0 変更点(だいたい)まとめSwift 2.0 変更点(だいたい)まとめ
Swift 2.0 変更点(だいたい)まとめ
 
ちょっと詳しくJavaScript 第3回【prototype】
ちょっと詳しくJavaScript 第3回【prototype】ちょっと詳しくJavaScript 第3回【prototype】
ちょっと詳しくJavaScript 第3回【prototype】
 
Swift の可変値と不変値 #cocoa_kansai
Swift の可変値と不変値 #cocoa_kansaiSwift の可変値と不変値 #cocoa_kansai
Swift の可変値と不変値 #cocoa_kansai
 
【DELPHI / C++BUILDER STARTER チュートリアルシリーズ】 シーズン2 Delphi の部 第2回 ‟変数と型„
【DELPHI / C++BUILDER STARTER チュートリアルシリーズ】 シーズン2 Delphi の部 第2回 ‟変数と型„【DELPHI / C++BUILDER STARTER チュートリアルシリーズ】 シーズン2 Delphi の部 第2回 ‟変数と型„
【DELPHI / C++BUILDER STARTER チュートリアルシリーズ】 シーズン2 Delphi の部 第2回 ‟変数と型„
 
【DELPHI / C++BUILDER STARTER チュートリアルシリーズ】 シーズン2 Delphi の部 第4回 「Function と Pro...
【DELPHI / C++BUILDER STARTER チュートリアルシリーズ】 シーズン2 Delphi の部 第4回 「Function と Pro...【DELPHI / C++BUILDER STARTER チュートリアルシリーズ】 シーズン2 Delphi の部 第4回 「Function と Pro...
【DELPHI / C++BUILDER STARTER チュートリアルシリーズ】 シーズン2 Delphi の部 第4回 「Function と Pro...
 
emc++ chapter32
emc++ chapter32emc++ chapter32
emc++ chapter32
 
final int をFINAL しやがれ!
final int をFINAL しやがれ!final int をFINAL しやがれ!
final int をFINAL しやがれ!
 
Deep dive into oss written in swift
Deep dive into oss written in swiftDeep dive into oss written in swift
Deep dive into oss written in swift
 
Kanazawa.js.Next
Kanazawa.js.NextKanazawa.js.Next
Kanazawa.js.Next
 
メタプログラミングRubyはこの付録が美味しい
メタプログラミングRubyはこの付録が美味しいメタプログラミングRubyはこの付録が美味しい
メタプログラミングRubyはこの付録が美味しい
 
Effective Modern C++ 勉強会#3 Item16
Effective Modern C++ 勉強会#3 Item16Effective Modern C++ 勉強会#3 Item16
Effective Modern C++ 勉強会#3 Item16
 
effective modern c++ chapeter36
effective modern c++ chapeter36effective modern c++ chapeter36
effective modern c++ chapeter36
 
プロトコル指向 - 夢と現実の狭間 #cswift
プロトコル指向 - 夢と現実の狭間 #cswiftプロトコル指向 - 夢と現実の狭間 #cswift
プロトコル指向 - 夢と現実の狭間 #cswift
 
Effective modern-c++#9
Effective modern-c++#9Effective modern-c++#9
Effective modern-c++#9
 
【DELPHI / C++BUILDER STARTER チュートリアルシリーズ】 シーズン2 Delphi の部 第5回 「配列 と レコード 」
【DELPHI / C++BUILDER STARTER チュートリアルシリーズ】 シーズン2 Delphi の部 第5回 「配列 と レコード 」【DELPHI / C++BUILDER STARTER チュートリアルシリーズ】 シーズン2 Delphi の部 第5回 「配列 と レコード 」
【DELPHI / C++BUILDER STARTER チュートリアルシリーズ】 シーズン2 Delphi の部 第5回 「配列 と レコード 」
 
今日からはじめるGPars
今日からはじめるGPars今日からはじめるGPars
今日からはじめるGPars
 
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
 
【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回 ‟シューティングゲームのプログラム„
 
すごいConstたのしく使おう!
すごいConstたのしく使おう!すごいConstたのしく使おう!
すごいConstたのしく使おう!
 
非同期処理の基礎
非同期処理の基礎非同期処理の基礎
非同期処理の基礎
 

Similar to Swift 2.0 で変わったところ「前編」 #cswift

ちょっと詳しくJavaScript 第2回【関数と引数】
ちょっと詳しくJavaScript 第2回【関数と引数】ちょっと詳しくJavaScript 第2回【関数と引数】
ちょっと詳しくJavaScript 第2回【関数と引数】
株式会社ランチェスター
 
Replace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JPReplace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JP
Akira Takahashi
 
10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1
 10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1 10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1
10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1
kenjis
 
13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs
Takayoshi Tanaka
 
Javaセキュアコーディングセミナー東京第3回講義
Javaセキュアコーディングセミナー東京第3回講義Javaセキュアコーディングセミナー東京第3回講義
Javaセキュアコーディングセミナー東京第3回講義
JPCERT Coordination Center
 

Similar to Swift 2.0 で変わったところ「前編」 #cswift (20)

ちょっと詳しくJavaScript 第2回【関数と引数】
ちょっと詳しくJavaScript 第2回【関数と引数】ちょっと詳しくJavaScript 第2回【関数と引数】
ちょっと詳しくJavaScript 第2回【関数と引数】
 
今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips
 
Xtext&Xtend documents
Xtext&Xtend documentsXtext&Xtend documents
Xtext&Xtend documents
 
Replace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JPReplace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JP
 
【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回 ‟関数„
 
第4回勉強会 単体テストのすすめ
第4回勉強会 単体テストのすすめ第4回勉強会 単体テストのすすめ
第4回勉強会 単体テストのすすめ
 
はこだてIKA 第4回勉強会 単体テスト
はこだてIKA 第4回勉強会 単体テストはこだてIKA 第4回勉強会 単体テスト
はこだてIKA 第4回勉強会 単体テスト
 
TypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめTypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめ
 
Swift らしい表現を目指そう #eventdots
Swift らしい表現を目指そう #eventdotsSwift らしい表現を目指そう #eventdots
Swift らしい表現を目指そう #eventdots
 
10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1
 10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1 10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1
10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1
 
from old Java to modern Java
from old Java to modern Javafrom old Java to modern Java
from old Java to modern Java
 
JavaScript.Next
JavaScript.NextJavaScript.Next
JavaScript.Next
 
Unit test in android
Unit test in androidUnit test in android
Unit test in android
 
Swiftおさらい
SwiftおさらいSwiftおさらい
Swiftおさらい
 
13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs
 
Javaセキュアコーディングセミナー東京第3回講義
Javaセキュアコーディングセミナー東京第3回講義Javaセキュアコーディングセミナー東京第3回講義
Javaセキュアコーディングセミナー東京第3回講義
 
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第6回 ‟文字列とオブジェクト„
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第6回 ‟文字列とオブジェクト„【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第6回 ‟文字列とオブジェクト„
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第6回 ‟文字列とオブジェクト„
 
Spock's world
Spock's worldSpock's world
Spock's world
 
[JavaDo] JAX-RS ハンズオン 第2部
[JavaDo] JAX-RS ハンズオン 第2部[JavaDo] JAX-RS ハンズオン 第2部
[JavaDo] JAX-RS ハンズオン 第2部
 
XPagesでRESTを使ってみたら、こんなんだった
XPagesでRESTを使ってみたら、こんなんだったXPagesでRESTを使ってみたら、こんなんだった
XPagesでRESTを使ってみたら、こんなんだった
 

More from Tomohiro Kumagai

More from Tomohiro Kumagai (20)

最近気づいた勉強法 — 勉強会開催の習慣化 #yumemi_grow
最近気づいた勉強法 — 勉強会開催の習慣化 #yumemi_grow最近気づいた勉強法 — 勉強会開催の習慣化 #yumemi_grow
最近気づいた勉強法 — 勉強会開催の習慣化 #yumemi_grow
 
Swift 所有権 要諦 #ゆるちとせ
Swift 所有権 要諦 #ゆるちとせSwift 所有権 要諦 #ゆるちとせ
Swift 所有権 要諦 #ゆるちとせ
 
_Function Builders in Swift #love_swift
_Function Builders in Swift #love_swift_Function Builders in Swift #love_swift
_Function Builders in Swift #love_swift
 
Property Wrappers の特徴を眺める #swiftzoomin
Property Wrappers の特徴を眺める #swiftzoominProperty Wrappers の特徴を眺める #swiftzoomin
Property Wrappers の特徴を眺める #swiftzoomin
 
みんなで Swift 復習会 GO! in "Swift Days Fukuoka" – 12nd′ オープニング&資料
みんなで Swift 復習会 GO! in "Swift Days Fukuoka" – 12nd′ オープニング&資料みんなで Swift 復習会 GO! in "Swift Days Fukuoka" – 12nd′ オープニング&資料
みんなで Swift 復習会 GO! in "Swift Days Fukuoka" – 12nd′ オープニング&資料
 
みんなで Swift 復習会
GO! in 札幌 – 10th′′
みんなで Swift 復習会
GO! in 札幌 – 10th′′みんなで Swift 復習会
GO! in 札幌 – 10th′′
みんなで Swift 復習会
GO! in 札幌 – 10th′′
 
イニシャライザー Part 2.5 #hakataswift
イニシャライザー Part 2.5 #hakataswiftイニシャライザー Part 2.5 #hakataswift
イニシャライザー Part 2.5 #hakataswift
 
ニコニコ超会議・文化の交差点 #techpub #ニコニコ超会議 #さくらシンデレラ
ニコニコ超会議・文化の交差点 #techpub #ニコニコ超会議 #さくらシンデレラニコニコ超会議・文化の交差点 #techpub #ニコニコ超会議 #さくらシンデレラ
ニコニコ超会議・文化の交差点 #techpub #ニコニコ超会議 #さくらシンデレラ
 
Swift クラスのイニシャライザー #devsap
Swift クラスのイニシャライザー #devsapSwift クラスのイニシャライザー #devsap
Swift クラスのイニシャライザー #devsap
 
iOSCon 2019 in London #ioscon #love_swift
iOSCon 2019 in London #ioscon #love_swiftiOSCon 2019 in London #ioscon #love_swift
iOSCon 2019 in London #ioscon #love_swift
 
Around the 変数 let #love_swift
Around the 変数 let #love_swiftAround the 変数 let #love_swift
Around the 変数 let #love_swift
 
もくもく執筆会 #技術同人誌再販Night
もくもく執筆会 #技術同人誌再販Nightもくもく執筆会 #技術同人誌再販Night
もくもく執筆会 #技術同人誌再販Night
 
みんなで Swift 復習会 GO! in 岩手 – 9th′
みんなで Swift 復習会 GO! in 岩手 – 9th′みんなで Swift 復習会 GO! in 岩手 – 9th′
みんなで Swift 復習会 GO! in 岩手 – 9th′
 
macOS アプリで Swift Package Manager を使ってみる #love_swift #hakataswift
macOS アプリで Swift Package Manager を使ってみる #love_swift #hakataswiftmacOS アプリで Swift Package Manager を使ってみる #love_swift #hakataswift
macOS アプリで Swift Package Manager を使ってみる #love_swift #hakataswift
 
みんなで Swift 復習会 GO! in 福岡 – 8th′ #minna_de_swift
みんなで Swift 復習会 GO! in 福岡 – 8th′ #minna_de_swiftみんなで Swift 復習会 GO! in 福岡 – 8th′ #minna_de_swift
みんなで Swift 復習会 GO! in 福岡 – 8th′ #minna_de_swift
 
Getting Started with Attending iOSCon in London 高画質・追記版 #love_swift #ioscon
Getting Started with Attending iOSCon in London 高画質・追記版 #love_swift #iosconGetting Started with Attending iOSCon in London 高画質・追記版 #love_swift #ioscon
Getting Started with Attending iOSCon in London 高画質・追記版 #love_swift #ioscon
 
みんなで Swift 復習会
GO! in 京都 – 6th′
みんなで Swift 復習会
GO! in 京都 – 6th′みんなで Swift 復習会
GO! in 京都 – 6th′
みんなで Swift 復習会
GO! in 京都 – 6th′
 
みんなで Swift 復習会 GO! in 福岡 – 5th′
みんなで Swift 復習会 GO! in 福岡 – 5th′みんなで Swift 復習会 GO! in 福岡 – 5th′
みんなで Swift 復習会 GO! in 福岡 – 5th′
 
勉強会の東京外開催の気持ち #yuru_bounen2017
勉強会の東京外開催の気持ち #yuru_bounen2017勉強会の東京外開催の気持ち #yuru_bounen2017
勉強会の東京外開催の気持ち #yuru_bounen2017
 
みんなで Swift 復習会 GO! in 福岡・発表資料
みんなで Swift 復習会 GO! in 福岡・発表資料みんなで Swift 復習会 GO! in 福岡・発表資料
みんなで Swift 復習会 GO! in 福岡・発表資料
 

Recently uploaded

2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
ssuserbefd24
 
研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計
研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計
研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計
atsushi061452
 

Recently uploaded (12)

情報を表現するときのポイント
情報を表現するときのポイント情報を表現するときのポイント
情報を表現するときのポイント
 
クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑
クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑
クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑
 
論文紹介:ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation
論文紹介:ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation論文紹介:ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation
論文紹介:ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation
 
Intranet Development v1.0 (TSG LIVE! 12 LT )
Intranet Development v1.0 (TSG LIVE! 12 LT )Intranet Development v1.0 (TSG LIVE! 12 LT )
Intranet Development v1.0 (TSG LIVE! 12 LT )
 
5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一
5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一
5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一
 
2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
 
部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員
部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員
部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員
 
ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521
ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521
ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521
 
研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計
研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計
研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計
 
論文紹介:Deep Occlusion-Aware Instance Segmentation With Overlapping BiLayers
論文紹介:Deep Occlusion-Aware Instance Segmentation With Overlapping BiLayers論文紹介:Deep Occlusion-Aware Instance Segmentation With Overlapping BiLayers
論文紹介:Deep Occlusion-Aware Instance Segmentation With Overlapping BiLayers
 
20240523_IoTLT_vol111_kitazaki_v1___.pdf
20240523_IoTLT_vol111_kitazaki_v1___.pdf20240523_IoTLT_vol111_kitazaki_v1___.pdf
20240523_IoTLT_vol111_kitazaki_v1___.pdf
 
Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)
Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)
Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)
 

Swift 2.0 で変わったところ「前編」 #cswift