SlideShare ist ein Scribd-Unternehmen logo
1 von 112
Downloaden Sie, um offline zu lesen
EZ-NET 熊⾕友宏
http://ez-net.jp/
2016.03.29
集まれSwift好き!Swift愛好会 #5
プロトコル指向に想う世界観
Swift カジュアルプログラミング
Swift 2.2
熊谷友宏
Xcode 5 徹底解説 MOSA
Xcode 5 の全機能を

徹底的に解説した本
OSX/iOS 系の歴史深い

有料会員制の勉強会
紙版は絶版、電子書籍は販売中
Xcode 7 でも役立つはず 法人会員も多数
@es_kumagai
EZ-NET http://ez-net.jp/
書籍 / 登壇
熊谷友宏
横浜 iPhone 開発者勉強会
#yidev
わいわい・ゆるく、iPhone 開発者の

みんなで楽しく過ごすのが目的の会
【 横浜・馬車道 】
カジュアル Swift 勉強会
#cswift
ゆるくみんなで Swift を語らえる場を

作りたくて始めた会
【 横浜・青葉台 】
第23回を 2016-05-07 に開催予定 第6回を 2016-04-02 に開催
@es_kumagai
EZ-NET http://ez-net.jp/
勉強会
熊谷友宏
@es_kumagai
EZ-NET http://ez-net.jp/
CodePiece
iOS, OS X, Apple Watch アプリ
ソースコードを Twitter と
Gist に同時投稿できる。
いつもの電卓
計算式も見える電卓アプリ。
watchOS 1 対応
音で再配達ゴッド
簡単操作で
再配達の申し込み。
EZ-NET IP Phone
iPhone でひかり電話を使う。
自宅 LAN からの利用専用
CodePiece for OS X
勉強会を楽しむアプリ
ソースコードを Twitter と Gist に同時投稿できる

勉強会で知見をみんなと共有したい時とかに便利!
できること
#__swift__
プロトコル指向ってなんだろう
プロトコル
プロトコル
拡張
型
型の拡張
▶ プロトコルは分かる。
▶ プロトコル拡張って?
▶ 型に実装するのと違う?
▶ 型も拡張できるけど

何が違うの?
▶ プロトコル拡張って

ときどき変な動きする?
▶ 既定の実装に何か違和感
▶ プロトコル拡張って

そもそも何?
プロトコル指向ってなんだろう
使うほどに見えなくなる
そこで
スピリチュアル
見えない世界からアプローチしたら
見えなかった世界が見えてくる
… かも?
あの世とこの世をつなぐもの
プロトコル
Protocol
おさらい
プロトコル
▶ 性質を決める
▶ 性質を表現するための概念を規定する
定義
protocol Movable {
func moved(x x:Int, y:Int) -> Self
func movedHorizontal(x:Int) -> Self
func movedVertical(y:Int) -> Self
}
プロトコル
▶ 概念を型で実現する … 実装
▶ その性質を持つことが約束される
適用
struct Location : Movable {
func moved(x x:Int, y:Int) -> Location {
return movedHorizontal(x).movedVertical(y)
}
func movedHorizontal(x:Int) -> Location {
return Location(x: self.x + x, y: self.y)
}
func movedVertical(y:Int) -> Location {
return Location(x: self.x, y: self.y + y)
}
}
プロトコル
▶ 型は性質の通りに振る舞える
▶ 必ず、振る舞える
実現
var location = Location(x: 0, y: 0)
location = location.movedHorizontal(10)
location = location.movedVertical(20)
location = location.moved(x: 4, y: 8)
>> 概念だけで説明できるものに注目
▶ プロトコルの概念だけで説明できる
▶ 適用する型ごとに変わるものではない
protocol Movable {
func moved(x x:Int, y:Int) -> Self
func movedHorizontal(x:Int) -> Self
func movedVertical(y:Int) -> Self
}
プロトコル
概念だけで説明できるもの
プロトコル拡張
▶ プロトコルの概念だけで説明する
▶ 既存の概念から新しい概念を作る … 実装?
protocol Movable {
func moved(x x:Int, y:Int) -> Self
func movedHorizontal(x:Int) -> Self
func movedVertical(y:Int) -> Self
}
extension Movable {
func moved(x x:Int, y:Int) -> Self {
return movedHorizontal(x).movedVertical(y)
}
}
プロトコル拡張
新概念を作る
プロトコル拡張
▶ 最低限の概念を型に落とし込む
▶ プロトコル拡張で規定した概念が使える
型は最低限の概念だけを実現
struct Location : Movable {
func movedHorizontal(x:Int) -> Location {
return Location(x: self.x + x, y: self.y)
}
func movedVertical(y:Int) -> Location {
return Location(x: self.x, y: self.y + y)
}
}
// 既定の実装が使える
let location = Location().moved(x: 10, y: 10)
ジェネリック関数
ジェネリック関数
▶ Movable に対応する型、みたいに指定
▶ プロトコルで規定した性質だけで組み立てる
任意の型を受け取れる関数
func randomMove<T:Movable>(location: T, maxStep: Int) -> T {
let deltaX = Int(arc4random_uniform(UInt32(maxStep)))
let deltaY = Int(arc4random_uniform(UInt32(maxStep)))
return location.moved(x: deltaX, y: deltaY)
}
// Movable に対応した Location 型を渡せる
var location = Location(x: 0, y: 0)
location = randomMove(location, maxStep: 100)
プロトコルの実例
CollectionType
複数の要素をまとめて扱う型の性質
extension Location : CollectionType {
var startIndex: Int {
return 0
}
var endIndex: Int {
return 2
}
subscript (index: Int) -> Int {
switch index {
case 0: return x
case 1: return y
default: fatalError()
}
}
}
CollectionType
型に適用
// 要素の数を取得できる
location.count
// 最初の要素 (x) と最後の要素 (y) を取得できる
location.first!
location.last!
// 要素を順次処理 (x -> y) できる
for v in location {
}
// すべての要素 (x, y) をそれぞれ 2 倍にした配列を取得する
location.map { $0 * 2 }
// x, y で、小さい方の値や大きい方の値を取得できる
location.minElement()
location.maxElement()
CollectionType
配列のように振る舞う型になる
プロトコルは自作できる
案外 むずかしい
やってみると
protocol PlayerType {
var content: Music? { get }
var canPlay: Bool { get }
func play() throws
}
プロトコル自作の難しさ
インターフェイスを規定する
final class MusicPlayer : PlayerType {
var content: Music?
var canPlay: Bool {
return content != nil
}
func play() throws {
guard canPlay else {
throw PlayerError.NotReady
}
try AVAudioPlayer(data: content!.data).play()
}
}
プロトコル自作の難しさ
型にプロトコルを適用する
let player = MusicPlayer(content: Music("SomeMusic.mp3"))
if player.canPlay {
try player.play()
}
プロトコル自作の難しさ
型にプロトコルを適用したときの動き
ちゃんと動く
再生 !
プロトコル自作の難しさ
プロトコル拡張を使うとき
final class MusicPlayer : PlayerType {
var content: Music?
var canPlay: Bool {
return content != nil
}
func play() throws {
guard canPlay else {
throw PlayerError.NotReady
}
try AVAudioPlayer(data: content!.data).play()
}
}
プロトコル自作の難しさ
プロトコルの概念だけで作られた部分
型に依存しない
extension PlayerType {
var canPlay: Bool {
return content != nil
}
}
final class MusicPlayer : PlayerType {
var content: Music?
func play() throws {
guard canPlay else {
throw PlayerError.NotReady
}
try AVAudioPlayer(data: content!.data).play()
}
}
プロトコル自作の難しさ
プロトコル拡張で規定する
プロトコル拡張
に移行
final class MusicPlayer : PlayerType {
var content: Music?
func play() throws {
guard canPlay else {
throw PlayerError.NotReady
}
try AVAudioPlayer(data: content!.data).play()
}
}
プロトコル自作の難しさ
プロトコルの概念だけで作られた部分
型に依存しない
extension PlayerType {
var canPlay: Bool {
return content != nil
}
func play() throws {
guard canPlay else {
throw PlayerError.NotReady
}
try AVAudioPlayer(data: content!.data).play()
}
}
final class MusicPlayer : PlayerType {
var content: Music?
}
プロトコル自作の難しさ
プロトコル拡張で規定する
プロトコル拡張
に移行
let player = MusicPlayer(content: Music("SomeMusic.mp3"))
if player.canPlay {
try player.play()
}
プロトコル自作の難しさ
プロトコル拡張で規定したときの動き
ちゃんと動く
再生 !
プロトコル自作の難しさ
拡張とは別に独自実装するとき
プロトコル自作の難しさ
別の型では独自に実装する
final class SilentSoundPlayer : PlayerType {
let content: Music? = nil
var canPlay: Bool {
return true
}
func play() throws {
guard canPlay else {
throw PlayerError.NotReady
}
try AVAudioPlayer(data: NullSound().data).play()
}
}
let player1 = MusicPlayer(content: Music("SomeMusic.mp3"))
let player2 = SilentSoundPlayer()
if player1.canPlay {
try player1.play()
}
if player2.canPlay {
try player2.play()
}
プロトコル自作の難しさ
別の型では独自に実装したときの動き
それぞれ期待通りに動く
再生 !
再生 !
// どんな PlayerType にも対応した再生関数を用意
func start<T:PlayerType>(player: T) throws {
if player.canPlay {
try player.play()
}
}
// 用意した関数で再生する
let player1 = MusicPlayer(content: Music("SomeMusic.mp3"))
let player2 = SilentSoundPlayer()
try start(player1)
try start(player2)
プロトコル自作の難しさ
別の型では独自に実装したときの動き
ジェネリック関数で共通化してみる
どちらも
再生 !
プロトコル自作の難しさ
宣言しないで拡張できる…けれど
protocol PlayerType {
var content: Music? { get }
// var canPlay: Bool { get }
func play() throws
}
extension PlayerType {
var canPlay: Bool {
return content != nil
}
func play() throws {
guard canPlay else {
throw PlayerError.NotReady
}
try AVAudioPlayer(data: content!.data).play()
}
}
プロトコルから
宣言を消去
if player1.canPlay {
try player1.play()
}
if player2.canPlay {
try player2.play()
}
プロトコル自作の難しさ
canPlay を宣言から省いたときの動き
再生 !
こちらは動きがおかしくなる…?
try start(player1)
try start(player2)
こちらはちゃんと動く
再生 !
player1 は 再生される
player2 は 再生されない
プロトコル自作の難しさ
さらにプロトコル拡張で共通化を図る…
protocol PlayerType {
var content: Music? { get }
// var canPlay: Bool { get }
func play() throws
}
extension PlayerType {
var canPlay: Bool {
return content != nil
}
func play() throws {
guard canPlay else {
throw PlayerError.NotReady
}
let data = content?.data ?? NullSound().data
try AVAudioPlayer(data: data).play()
}
}
content = nil 時の
無音再生に対応
final class SilentSoundPlayer : PlayerType {
let content: Music? = nil
var canPlay: Bool {
return true
}
// func play() throws {
//
// guard canPlay else {
// throw PlayerError.NotReady
// }
//
// try AVAudioPlayer(data: NullSound().data).play()
// }
}
プロトコル拡張で
対応したので消去
こちらも動きがおかしくなる…?
if player1.canPlay {
try player1.play()
}
if player2.canPlay {
try player2.play()
}
プロトコル自作の難しさ
play をプロトコル拡張で共通化したときの動き
再生 !
こちらの動きは従前通りのおかしさ
try start(player1)
try start(player2)
player1 は 再生される
player2 は 再生されない
canPlay は 成功
play 実行時に NotReady エラー
いったい何が起こっているのか
見えない世界を垣間見たい
何か得体の知れない世界
得てして人が頼るもの
そんなときに
スピリチュアル
Swift の世界を観察
スピリチュアルで
プロトコル型
精神世界物質世界
〓
人間界
〓
霊界
型に囚われない世界型の世界
物質世界 精神世界
人間界 霊界
明確に分離
見える 見えない
人間
(インスタンス)
プロトコル型
物質世界 精神世界
人間界 霊界
干渉する
人間
(インスタンス)
プロトコル型
魂 / 霊
(???) 霊媒
Implementation を観察
Implementation を観察
型とプロトコルにおける実装
人間界 霊界
プロトコル型
Implementation Default Implementation
extension Human {
func speak() {
…
}
}
extension Speakable {
func speak() {
…
}
}
Implementation を観察
何に実装されるのかに着目
人間界 霊界
物質世界 精神世界
Implementation Default Implementation
func speak() func speak()
プロトコル型
“物体にしゃべり方を定義”
… わかる気がする
“魂にしゃべり方を定義”
… よくわからない
Implementation を観察
観測的な視点に着目
人間界 霊界
物質世界 精神世界
func speak() func speak()
見える 見えない
人間
(インスタンス)
見えてくること
プロトコル型
Implementation を観察
ふたつの“同じ”実装の違い
人間界 霊界
func speak()
実体

✓ 見える
✓ しゃべり方を知っているから しゃべれる
プロトコル型
Implementation を観察
ふたつの“同じ”実装の違い
人間界 霊界
func speak()
実体

✓ 見えない
✓ なんかわからないけど しゃべれる
なんかわからないけど 出来る
プロトコルは
本能
Implementation
人間界 霊界
プロトコル型
Implementation Default Implementation
func speak() func speak()
“物体にしゃべり方を搭載”
… 後天的にできることを規定
“魂にしゃべり方を刻む”

… 先天的にできることを規定
ふたつの“同じ”実装の 意味合い
2世界からのアプローチ
2世界からのアプローチ
プロトコル拡張とは別に独自実装
▶ プロトコル拡張でメソッドを定義
▶ 同じメソッドを型で独自に定義
// 型の定義
class Human:Speakable {
func speak() {
…
}
}
// プロトコルの定義
protocol Speakable {
}
extension Speakable {
func speak() {
…
}
}
プロトコル型
2世界からのアプローチ
プロトコル拡張とは別に独自実装
人間界 霊界
func speak() func speak()
実体

こちらが実行される こちらは実行されない
型の実装で上書きされた?
2世界からのアプローチ
それぞれの世界に存在する
人間界 霊界
物質世界 精神世界
人間
(インスタンス)
func speak() func speak()
現実に存在している 見えないだけで存在している
見えるものを実行
魂 / 霊
(???)
本能を発現
本能は隠蔽される
(言葉こそ意思疎通手段)
本能が解放される
(言葉に依らない意思疎通)
精神世界からの干渉
歩く
歩く
▶ 足を使って移動する行為
▶ 片足を地面について重心を乗せ、

もう片足を進行方向へ運ぶ
概要
地面はどこにあるのか
歩く
▶ 地面は物質世界にある
▶ 歩く概念は精神世界にも存在できる
▶ 足を地につけられるのは現実世界だけ
▶ 精神世界だけでは実現できない
地面はどこにあるのか
精神世界が現実世界に干渉する必要性
歩く
人間
(インスタンス)
魂 / 霊
(???)
霊媒
精神世界が現実世界に干渉
人間界 霊界
干渉する
物質世界 精神世界
プロトコル型
歩きを発現
歩行を念ずる
干渉する事柄をプロトコルで規定
歩く
干渉する事柄をプロトコルで規定
▶ プロトコルで物質世界への干渉を宣言
▶ 型で物質世界での動きを具現化
// 型の定義
class Human:Walkable {
func walk() {
…
}
}
// プロトコルの定義
protocol Walkable {
func walk()
}
extension Walkable {
}
宣言
具現化
歩く
2世界からのアプローチ
人間界 霊界
物質世界 精神世界
人間
(インスタンス)
func walk() func walk()
実際の歩行を定義 概念のみを規定
見えるものを実行
魂 / 霊
(???)
歩行を念じる
現実に

干渉
現実で

体現
先天性と後天性
先天性と後天性
要約
▶ プロトコル拡張で規定したものは 先天的
▶ 型で規定したものは 後天的
// 人間には独自の遊泳を定義
class Human:Swimmable {
func swim() {
…
}
}
// 犬の遊泳は本能に従う
class Dog:Swimmable {
}
// プロトコルの定義
protocol Swimmable {
func swim()
}
extension Swimmable {
func swim() {
…
}
}
先天性と後天性
本能の発現
人間界 霊界
物質世界 精神世界
犬
(インスタンス)
func swim() {
…
}
なぜか泳げる
魂 / 霊
(???)
func swim()
現実に

干渉
現実で

体現
遊泳を念じる
本能が発現
先天性と後天性
体験による本能の置き換え
人間界 霊界
物質世界 精神世界
人間
(インスタンス)
func swim() {
…
}
泳ぎは習得した
魂 / 霊
(???)
func swim()
遊泳を念じる
本能は隠蔽
func swim()
現実に

干渉
現実で

体現
型からの解放
プロトコル型
型からの解放
魂とは何者なのか
人間界 霊界
人間
(インスタンス)
func speak() func speak()
見えるものを実行
魂 / 霊
(???)
本能を発現
これは
何者なのか
型からの解放
▶ プロトコルで引数の種類を特定する
▶ 実際の型に囚われない
ヒントは ジェネリック関数
func randomMove<T:Movable>(location: T, maxStep: Int) -> T {
…
}
// Movable に対応した Location 型を渡せる
var location = Location(x: 0, y: 0)
location = randomMove(location, maxStep: 100)
型に囚われない世界
精神世界
型からの解放
ジェネリックによる昇華
人間界 霊界
物質世界 精神世界
人間
(インスタンス)
func speak() func speak()
ジェネリックを通して

霊体へと昇華
魂 / 霊
(???)
本能を発現
型からの解放
本能による昇華
人間界 霊界
物質世界 精神世界
人間
(インスタンス)
func speak() func speak()
本能を通して魂に昇華
魂 / 霊
(???)
本能を発現
func laugh()
なぜか笑える
見えない世界を垣間見たい
プロトコルの世界観
1. プロトコルは本能
2. 物質世界と精神世界、2つのアプローチ
3. 精神世界から物質世界への干渉を宣言
4. 先天性と後天性という実装観点
5. ジェネリックによる型からの解放
これが …
プロトコルの世界 … !?
動作事例を解く
プロトコル自作の難しさ
canPlay を宣言から省いたときの動き
プロトコル自作の難しさ
canPlay を宣言から省いたときの動き
// このうちの player2 で不思議な動作が起こる
let player1 = MusicPlayer(content: Music("SomeMusic.mp3"))
let player2 = SilentSoundPlayer()
// どんな PlayerType にも対応した再生関数を用意
func start<T:PlayerType>(player: T) throws {
if player.canPlay {
try player.play()
}
}
ジェネリック引数は
型に囚われない
精神世界に解き放たれる
〓
protocol PlayerType {
var content: Music? { get }
// var canPlay: Bool { get }
func play() throws
}
extension PlayerType {
var canPlay: Bool {
return content != nil
}
func play() throws {
guard canPlay else {
throw PlayerError.NotReady
}
try AVAudioPlayer(data: content!.data).play()
}
}
プロトコルから
宣言を消去
物質世界に干渉しない
〓
if player1.canPlay {
try player1.play()
}
if player2.canPlay {
try player2.play()
}
プロトコル自作の難しさ
canPlay を宣言から省いたときの動き
再生 !
こちらは動きがおかしくなる…?
try start(player1)
try start(player2)
こちらはちゃんと動く
再生 !
player1 は 再生される
player2 は 再生されない
プロトコル自作の難しさ
canPlay を宣言から省いたときの動き
人間界 霊界
SilentSoundPlayer
(インスタンス)
現実に存在している 見えないだけで存在している
canPlay を発動
魂 / 霊
(ジェネリック)
ジェネリック引数に渡す
(型から解き放たれる)
本能が解放される
(型に囚われない世界)
発現しない
プロトコル型
var canPlay() var canPlay
本能が発現
プロトコル自作の難しさ
さらにプロトコル拡張で共通化を図る…
protocol PlayerType {
var content: Music? { get }
// var canPlay: Bool { get }
func play() throws
}
extension PlayerType {
var canPlay: Bool {
return content != nil
}
func play() throws {
guard canPlay else {
throw PlayerError.NotReady
}
let data = content?.data ?? NullSound().data
try AVAudioPlayer(data: data).play()
}
}
content = nil 時の
無音再生に対応
本能側を調整
〓
プロトコルに
宣言しない
物質世界に干渉しない
〓
final class SilentSoundPlayer : PlayerType {
let content: Music? = nil
var canPlay: Bool {
return true
}
// func play() throws {
//
// guard canPlay else {
// throw PlayerError.NotReady
// }
//
// try AVAudioPlayer(data: NullSound().data).play()
// }
}
プロトコル拡張で
対応したので消去
本能に委ねる
〓
こちらも動きがおかしくなる…?
if player1.canPlay {
try player1.play()
}
if player2.canPlay {
try player2.play()
}
プロトコル自作の難しさ
play をプロトコル拡張で共通化したときの動き
再生 !
こちらの動きは従前通りのおかしさ
try start(player1)
try start(player2)
player1 は 再生される
player2 は 再生されない
canPlay は 成功
play 実行時に NotReady エラー
if player2.canPlay {
プロトコル自作の難しさ
play をプロトコル拡張で共通化したときの動き
まずはこれから観察
プロトコル自作の難しさ
play をプロトコル拡張で共通化したときの動き
人間界 霊界
SilentSoundPlayer
(インスタンス)
現実に存在している 見えないだけで存在している
発現しない
プロトコル型
var canPlay() var canPlay
実装が発現
型から直接実行
見えるものを実行
try player2.play()
プロトコル自作の難しさ
play をプロトコル拡張で共通化したときの動き
そしてこれを観察
プロトコル自作の難しさ
play をプロトコル拡張で共通化したときの動き
人間界 霊界
SilentSoundPlayer
(インスタンス)
見えないだけで存在している
本能が解放される
(型に囚われない世界)
発現しない
プロトコル型
var canPlay() var canPlay
本能が発現
型から直接実行
なぜかplayできる
var play
canPlay を発動
プロトコルの挙動を説明できた!
スピリチュアルで
ほかにも
プロトコル型
ほかにも
データの保存場所は物質世界
人間界 霊界
人間
(インスタンス)
var story:String
データの入れ物は

物質世界に所属
魂 / 霊
(???)
読み書きするには
現実への干渉が不可欠
var story:String
プロトコル型
ほかにも
インスタンスは物質世界に生成
人間界 霊界
インスタンス
(インスタンス)
init()
インスタンスは

物質世界に生成
魂 / 霊
(???)
インスタンス生成には
現実への干渉が不可欠
init()
以上
プロトコル指向に想う世界観
まとめ
プロトコル指向に想う世界観
1. プロトコル志向ってなんだろう
✓ プロトコル、ジェネリック関数、プロトコル拡張
✓ 自作は案外難しい
2. 見えない世界を垣間見たい
✓ 2世界からのアプローチ
✓ 精神世界からの干渉
• 歩く、地面はどこにあるのか
• 干渉する事柄をプロトコルで規定
✓ 先天性と後天性
✓ 型からの解放
3. 動作事例を解く

Weitere ähnliche Inhalte

Was ist angesagt?

プロトコル拡張の話? #WWDC21cafe
プロトコル拡張の話? #WWDC21cafeプロトコル拡張の話? #WWDC21cafe
プロトコル拡張の話? #WWDC21cafeTomohiro Kumagai
 
ジェネリック関数の呼び出され方 #cocoa_kansai
ジェネリック関数の呼び出され方 #cocoa_kansaiジェネリック関数の呼び出され方 #cocoa_kansai
ジェネリック関数の呼び出され方 #cocoa_kansaiTomohiro Kumagai
 
Swift の可変値と不変値 #cocoa_kansai
Swift の可変値と不変値 #cocoa_kansaiSwift の可変値と不変値 #cocoa_kansai
Swift の可変値と不変値 #cocoa_kansaiTomohiro Kumagai
 
NSNotification in Swift #cocoa_kansai
NSNotification in Swift #cocoa_kansaiNSNotification in Swift #cocoa_kansai
NSNotification in Swift #cocoa_kansaiTomohiro Kumagai
 
第7回 カジュアル Swift 勉強会 @ 青葉台 オープニング #cswift
第7回 カジュアル Swift 勉強会 @ 青葉台 オープニング #cswift第7回 カジュアル Swift 勉強会 @ 青葉台 オープニング #cswift
第7回 カジュアル Swift 勉強会 @ 青葉台 オープニング #cswiftTomohiro Kumagai
 
Swift 構造体の時代 #yidev
Swift 構造体の時代 #yidevSwift 構造体の時代 #yidev
Swift 構造体の時代 #yidevTomohiro Kumagai
 
Swift 2.0 の Error Handling #yhios
Swift 2.0 の Error Handling #yhiosSwift 2.0 の Error Handling #yhios
Swift 2.0 の Error Handling #yhiosTomohiro Kumagai
 
Swift 2.0 大域関数の行方から #swift2symposium
Swift 2.0 大域関数の行方から #swift2symposiumSwift 2.0 大域関数の行方から #swift2symposium
Swift 2.0 大域関数の行方から #swift2symposiumTomohiro Kumagai
 
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 swiftYuki Asai
 
Swift を振り返ってみよう #cswift
Swift を振り返ってみよう #cswiftSwift を振り返ってみよう #cswift
Swift を振り返ってみよう #cswiftTomohiro Kumagai
 
Swiftのswitchはとってもパワフル!
Swiftのswitchはとってもパワフル!Swiftのswitchはとってもパワフル!
Swiftのswitchはとってもパワフル!akatsuki174
 
Swift : クラス継承とプロトコル拡張を比べてみる #yidev
Swift : クラス継承とプロトコル拡張を比べてみる #yidevSwift : クラス継承とプロトコル拡張を比べてみる #yidev
Swift : クラス継承とプロトコル拡張を比べてみる #yidevTomohiro Kumagai
 
Swift 2 (& lldb) シンポジウム
Swift 2 (& lldb) シンポジウムSwift 2 (& lldb) シンポジウム
Swift 2 (& lldb) シンポジウムYuichi Yoshida
 
Swiftからlibuvを呼び出すTIPS
Swiftからlibuvを呼び出すTIPSSwiftからlibuvを呼び出すTIPS
Swiftからlibuvを呼び出すTIPSjugemjugemjugem
 
Pattern match with case class
Pattern match with case classPattern match with case class
Pattern match with case classKai Sasaki
 
final int をFINAL しやがれ!
final int をFINAL しやがれ!final int をFINAL しやがれ!
final int をFINAL しやがれ!Keiichi Nagaoka
 
jvmlang.daitokai 1.0.0 MinCamlJを作ってみた
jvmlang.daitokai 1.0.0 MinCamlJを作ってみたjvmlang.daitokai 1.0.0 MinCamlJを作ってみた
jvmlang.daitokai 1.0.0 MinCamlJを作ってみたKazuyoshi Kamitsukasa
 
Lombokのススメ
LombokのススメLombokのススメ
Lombokのススメなべ
 

Was ist angesagt? (20)

プロトコル拡張の話? #WWDC21cafe
プロトコル拡張の話? #WWDC21cafeプロトコル拡張の話? #WWDC21cafe
プロトコル拡張の話? #WWDC21cafe
 
ジェネリック関数の呼び出され方 #cocoa_kansai
ジェネリック関数の呼び出され方 #cocoa_kansaiジェネリック関数の呼び出され方 #cocoa_kansai
ジェネリック関数の呼び出され方 #cocoa_kansai
 
Swift の可変値と不変値 #cocoa_kansai
Swift の可変値と不変値 #cocoa_kansaiSwift の可変値と不変値 #cocoa_kansai
Swift の可変値と不変値 #cocoa_kansai
 
NSNotification in Swift #cocoa_kansai
NSNotification in Swift #cocoa_kansaiNSNotification in Swift #cocoa_kansai
NSNotification in Swift #cocoa_kansai
 
第7回 カジュアル Swift 勉強会 @ 青葉台 オープニング #cswift
第7回 カジュアル Swift 勉強会 @ 青葉台 オープニング #cswift第7回 カジュアル Swift 勉強会 @ 青葉台 オープニング #cswift
第7回 カジュアル Swift 勉強会 @ 青葉台 オープニング #cswift
 
Swift 構造体の時代 #yidev
Swift 構造体の時代 #yidevSwift 構造体の時代 #yidev
Swift 構造体の時代 #yidev
 
Swift 2.0 の Error Handling #yhios
Swift 2.0 の Error Handling #yhiosSwift 2.0 の Error Handling #yhios
Swift 2.0 の Error Handling #yhios
 
Swift 2.0 大域関数の行方から #swift2symposium
Swift 2.0 大域関数の行方から #swift2symposiumSwift 2.0 大域関数の行方から #swift2symposium
Swift 2.0 大域関数の行方から #swift2symposium
 
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
 
Study Swift
Study Swift Study Swift
Study Swift
 
Swift を振り返ってみよう #cswift
Swift を振り返ってみよう #cswiftSwift を振り返ってみよう #cswift
Swift を振り返ってみよう #cswift
 
Swiftのswitchはとってもパワフル!
Swiftのswitchはとってもパワフル!Swiftのswitchはとってもパワフル!
Swiftのswitchはとってもパワフル!
 
Swift : クラス継承とプロトコル拡張を比べてみる #yidev
Swift : クラス継承とプロトコル拡張を比べてみる #yidevSwift : クラス継承とプロトコル拡張を比べてみる #yidev
Swift : クラス継承とプロトコル拡張を比べてみる #yidev
 
Swift 2 (& lldb) シンポジウム
Swift 2 (& lldb) シンポジウムSwift 2 (& lldb) シンポジウム
Swift 2 (& lldb) シンポジウム
 
Swiftからlibuvを呼び出すTIPS
Swiftからlibuvを呼び出すTIPSSwiftからlibuvを呼び出すTIPS
Swiftからlibuvを呼び出すTIPS
 
Pattern match with case class
Pattern match with case classPattern match with case class
Pattern match with case class
 
final int をFINAL しやがれ!
final int をFINAL しやがれ!final int をFINAL しやがれ!
final int をFINAL しやがれ!
 
jvmlang.daitokai 1.0.0 MinCamlJを作ってみた
jvmlang.daitokai 1.0.0 MinCamlJを作ってみたjvmlang.daitokai 1.0.0 MinCamlJを作ってみた
jvmlang.daitokai 1.0.0 MinCamlJを作ってみた
 
Node native ext
Node native extNode native ext
Node native ext
 
Lombokのススメ
LombokのススメLombokのススメ
Lombokのススメ
 

Andere mochten auch

キネマ・ナイト002
キネマ・ナイト002キネマ・ナイト002
キネマ・ナイト002Ayano Yoshikawa
 
iPhoneアプリ無料勉強会 vol3
iPhoneアプリ無料勉強会 vol3iPhoneアプリ無料勉強会 vol3
iPhoneアプリ無料勉強会 vol3codeal
 
成長する組織を支えるシロクの自動化
成長する組織を支えるシロクの自動化成長する組織を支えるシロクの自動化
成長する組織を支えるシロクの自動化Naoyuki Kataoka
 
openSUSE におけるパッケージ管理入門
openSUSE におけるパッケージ管理入門openSUSE におけるパッケージ管理入門
openSUSE におけるパッケージ管理入門Fuminobu Takeyama
 
シロク流事業の立ち上げ方の成功と失敗
シロク流事業の立ち上げ方の成功と失敗シロク流事業の立ち上げ方の成功と失敗
シロク流事業の立ち上げ方の成功と失敗Naoyuki Kataoka
 
Xp祭り2014 agile2014参加報告(パターンネットワーク分析を含む)
Xp祭り2014 agile2014参加報告(パターンネットワーク分析を含む)Xp祭り2014 agile2014参加報告(パターンネットワーク分析を含む)
Xp祭り2014 agile2014参加報告(パターンネットワーク分析を含む)Hironori Washizaki
 
Swiftの循環参照
Swiftの循環参照Swiftの循環参照
Swiftの循環参照SatoTakeshi
 
AKIBA.swift vol.1
AKIBA.swift vol.1AKIBA.swift vol.1
AKIBA.swift vol.1cocominap
 
Swift3とObjective-Cのブリッジでハマったこと
Swift3とObjective-CのブリッジでハマったことSwift3とObjective-Cのブリッジでハマったこと
Swift3とObjective-Cのブリッジでハマったこと庸介 高橋
 
モダンな開発現場になるためのお作法としてのツール活用
モダンな開発現場になるためのお作法としてのツール活用モダンな開発現場になるためのお作法としてのツール活用
モダンな開発現場になるためのお作法としてのツール活用智治 長沢
 
iPhoneアプリ無料勉強会 vol2
iPhoneアプリ無料勉強会 vol2iPhoneアプリ無料勉強会 vol2
iPhoneアプリ無料勉強会 vol2codeal
 
クラウド利用も可能になって身近になった超高速リアルタイムEAI「Magic xpi」
クラウド利用も可能になって身近になった超高速リアルタイムEAI「Magic xpi」クラウド利用も可能になって身近になった超高速リアルタイムEAI「Magic xpi」
クラウド利用も可能になって身近になった超高速リアルタイムEAI「Magic xpi」Tsuyoshi Watanabe
 
多人数iOSアプリ開発を考える
多人数iOSアプリ開発を考える多人数iOSアプリ開発を考える
多人数iOSアプリ開発を考えるsasaron 397
 
iOS開発を楽しむ最初の一歩!デリゲートをなるべく分かりやすく!
iOS開発を楽しむ最初の一歩!デリゲートをなるべく分かりやすく!iOS開発を楽しむ最初の一歩!デリゲートをなるべく分かりやすく!
iOS開発を楽しむ最初の一歩!デリゲートをなるべく分かりやすく!Kanako Kobayashi
 
ナレッジを共有する文化をつくるために
ナレッジを共有する文化をつくるためにナレッジを共有する文化をつくるために
ナレッジを共有する文化をつくるためにRecruit Lifestyle Co., Ltd.
 
YAPC::Hokkaido 2016 「普段使い言語環境」更新によるスキルリセットサバイバルガイド
YAPC::Hokkaido 2016 「普段使い言語環境」更新によるスキルリセットサバイバルガイドYAPC::Hokkaido 2016 「普段使い言語環境」更新によるスキルリセットサバイバルガイド
YAPC::Hokkaido 2016 「普段使い言語環境」更新によるスキルリセットサバイバルガイドkeroyonn
 
Swiftにおけるclassとstructの使い分けをDDDから考える
Swiftにおけるclassとstructの使い分けをDDDから考えるSwiftにおけるclassとstructの使い分けをDDDから考える
Swiftにおけるclassとstructの使い分けをDDDから考えるTakuya Kitamura
 
コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi
コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashiコンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi
コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashiMasaki Hayashi
 
asm.jsとWebAssemblyって実際なんなの?
asm.jsとWebAssemblyって実際なんなの?asm.jsとWebAssemblyって実際なんなの?
asm.jsとWebAssemblyって実際なんなの?Yosuke Onoue
 

Andere mochten auch (20)

キネマ・ナイト002
キネマ・ナイト002キネマ・ナイト002
キネマ・ナイト002
 
iPhoneアプリ無料勉強会 vol3
iPhoneアプリ無料勉強会 vol3iPhoneアプリ無料勉強会 vol3
iPhoneアプリ無料勉強会 vol3
 
成長する組織を支えるシロクの自動化
成長する組織を支えるシロクの自動化成長する組織を支えるシロクの自動化
成長する組織を支えるシロクの自動化
 
openSUSE におけるパッケージ管理入門
openSUSE におけるパッケージ管理入門openSUSE におけるパッケージ管理入門
openSUSE におけるパッケージ管理入門
 
シロク流事業の立ち上げ方の成功と失敗
シロク流事業の立ち上げ方の成功と失敗シロク流事業の立ち上げ方の成功と失敗
シロク流事業の立ち上げ方の成功と失敗
 
Xp祭り2014 agile2014参加報告(パターンネットワーク分析を含む)
Xp祭り2014 agile2014参加報告(パターンネットワーク分析を含む)Xp祭り2014 agile2014参加報告(パターンネットワーク分析を含む)
Xp祭り2014 agile2014参加報告(パターンネットワーク分析を含む)
 
Swiftの循環参照
Swiftの循環参照Swiftの循環参照
Swiftの循環参照
 
AKIBA.swift vol.1
AKIBA.swift vol.1AKIBA.swift vol.1
AKIBA.swift vol.1
 
Swift3とObjective-Cのブリッジでハマったこと
Swift3とObjective-CのブリッジでハマったことSwift3とObjective-Cのブリッジでハマったこと
Swift3とObjective-Cのブリッジでハマったこと
 
モダンな開発現場になるためのお作法としてのツール活用
モダンな開発現場になるためのお作法としてのツール活用モダンな開発現場になるためのお作法としてのツール活用
モダンな開発現場になるためのお作法としてのツール活用
 
iPhoneアプリ無料勉強会 vol2
iPhoneアプリ無料勉強会 vol2iPhoneアプリ無料勉強会 vol2
iPhoneアプリ無料勉強会 vol2
 
クラウド利用も可能になって身近になった超高速リアルタイムEAI「Magic xpi」
クラウド利用も可能になって身近になった超高速リアルタイムEAI「Magic xpi」クラウド利用も可能になって身近になった超高速リアルタイムEAI「Magic xpi」
クラウド利用も可能になって身近になった超高速リアルタイムEAI「Magic xpi」
 
多人数iOSアプリ開発を考える
多人数iOSアプリ開発を考える多人数iOSアプリ開発を考える
多人数iOSアプリ開発を考える
 
iOS開発を楽しむ最初の一歩!デリゲートをなるべく分かりやすく!
iOS開発を楽しむ最初の一歩!デリゲートをなるべく分かりやすく!iOS開発を楽しむ最初の一歩!デリゲートをなるべく分かりやすく!
iOS開発を楽しむ最初の一歩!デリゲートをなるべく分かりやすく!
 
ナレッジを共有する文化をつくるために
ナレッジを共有する文化をつくるためにナレッジを共有する文化をつくるために
ナレッジを共有する文化をつくるために
 
チケット駆動で加速する顧客と協業するプロジェクトマネジメント
チケット駆動で加速する顧客と協業するプロジェクトマネジメントチケット駆動で加速する顧客と協業するプロジェクトマネジメント
チケット駆動で加速する顧客と協業するプロジェクトマネジメント
 
YAPC::Hokkaido 2016 「普段使い言語環境」更新によるスキルリセットサバイバルガイド
YAPC::Hokkaido 2016 「普段使い言語環境」更新によるスキルリセットサバイバルガイドYAPC::Hokkaido 2016 「普段使い言語環境」更新によるスキルリセットサバイバルガイド
YAPC::Hokkaido 2016 「普段使い言語環境」更新によるスキルリセットサバイバルガイド
 
Swiftにおけるclassとstructの使い分けをDDDから考える
Swiftにおけるclassとstructの使い分けをDDDから考えるSwiftにおけるclassとstructの使い分けをDDDから考える
Swiftにおけるclassとstructの使い分けをDDDから考える
 
コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi
コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashiコンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi
コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi
 
asm.jsとWebAssemblyって実際なんなの?
asm.jsとWebAssemblyって実際なんなの?asm.jsとWebAssemblyって実際なんなの?
asm.jsとWebAssemblyって実際なんなの?
 

Ähnlich wie プロトコル指向に想う世界観 #__swift__

第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」yoshiaki iwanaga
 
Node.jsでつくるNode.js ミニインタープリター&コンパイラー
Node.jsでつくるNode.js ミニインタープリター&コンパイラーNode.jsでつくるNode.js ミニインタープリター&コンパイラー
Node.jsでつくるNode.js ミニインタープリター&コンパイラーmganeko
 
ElixirをIoTボードで動かしてみた ~ラズパイ・big.LITTLE・Zynq編~
ElixirをIoTボードで動かしてみた ~ラズパイ・big.LITTLE・Zynq編~ElixirをIoTボードで動かしてみた ~ラズパイ・big.LITTLE・Zynq編~
ElixirをIoTボードで動かしてみた ~ラズパイ・big.LITTLE・Zynq編~Hideki Takase
 
○○大学の本当にあった怖い話
○○大学の本当にあった怖い話○○大学の本当にあった怖い話
○○大学の本当にあった怖い話idkqh7 Nishino
 
History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法
History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法
History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法Yoshifumi Kawai
 
Java x Groovy: improve your java development life
Java x Groovy: improve your java development lifeJava x Groovy: improve your java development life
Java x Groovy: improve your java development lifeUehara Junji
 
どこでも動くゲームを作るためのベタープラクティス
どこでも動くゲームを作るためのベタープラクティスどこでも動くゲームを作るためのベタープラクティス
どこでも動くゲームを作るためのベタープラクティス5mingame2
 
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8y_taka_23
 
TypeScript と Visual Studio Code
TypeScript と Visual Studio CodeTypeScript と Visual Studio Code
TypeScript と Visual Studio CodeAkira Inoue
 
WebSocket+Akka(Remote)+Play 2.1 Java
WebSocket+Akka(Remote)+Play 2.1 JavaWebSocket+Akka(Remote)+Play 2.1 Java
WebSocket+Akka(Remote)+Play 2.1 JavaKazuhiro Hara
 
これからの「言語」の話をしよう ―― 未来を生きるためのツール
これからの「言語」の話をしよう ―― 未来を生きるためのツールこれからの「言語」の話をしよう ―― 未来を生きるためのツール
これからの「言語」の話をしよう ―― 未来を生きるためのツールNobuhisa Koizumi
 
Javaセキュアコーディングセミナー東京第3回講義
Javaセキュアコーディングセミナー東京第3回講義Javaセキュアコーディングセミナー東京第3回講義
Javaセキュアコーディングセミナー東京第3回講義JPCERT Coordination Center
 
197x Timer with Your Messages
197x Timer with Your Messages197x Timer with Your Messages
197x Timer with Your MessagesKuniaki Igarashi
 
Python Kyoto study
Python Kyoto studyPython Kyoto study
Python Kyoto studyNaoya Inada
 
Shibuya JVM Groovy 20150418
Shibuya JVM Groovy 20150418Shibuya JVM Groovy 20150418
Shibuya JVM Groovy 20150418Uehara Junji
 
ゲーム開発初心者の僕がUnity + WebSocketで何か作ってみた
ゲーム開発初心者の僕がUnity + WebSocketで何か作ってみたゲーム開発初心者の僕がUnity + WebSocketで何か作ってみた
ゲーム開発初心者の僕がUnity + WebSocketで何か作ってみたKohei Kadowaki
 
Lisp tutorial for Pythonista : Day 1
Lisp tutorial for Pythonista : Day 1Lisp tutorial for Pythonista : Day 1
Lisp tutorial for Pythonista : Day 1Ransui Iso
 
"今" 押さえておきたい! Web アプリ開発の技術トレンドとツールの進化
"今" 押さえておきたい! Web アプリ開発の技術トレンドとツールの進化"今" 押さえておきたい! Web アプリ開発の技術トレンドとツールの進化
"今" 押さえておきたい! Web アプリ開発の技術トレンドとツールの進化Akira Inoue
 
Go言語入門者が Webアプリケーション を作ってみた話 #devfest #gdgkyoto
Go言語入門者が Webアプリケーション を作ってみた話 #devfest #gdgkyotoGo言語入門者が Webアプリケーション を作ってみた話 #devfest #gdgkyoto
Go言語入門者が Webアプリケーション を作ってみた話 #devfest #gdgkyotoShoot Morii
 

Ähnlich wie プロトコル指向に想う世界観 #__swift__ (20)

第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」
 
Node.jsでつくるNode.js ミニインタープリター&コンパイラー
Node.jsでつくるNode.js ミニインタープリター&コンパイラーNode.jsでつくるNode.js ミニインタープリター&コンパイラー
Node.jsでつくるNode.js ミニインタープリター&コンパイラー
 
ElixirをIoTボードで動かしてみた ~ラズパイ・big.LITTLE・Zynq編~
ElixirをIoTボードで動かしてみた ~ラズパイ・big.LITTLE・Zynq編~ElixirをIoTボードで動かしてみた ~ラズパイ・big.LITTLE・Zynq編~
ElixirをIoTボードで動かしてみた ~ラズパイ・big.LITTLE・Zynq編~
 
○○大学の本当にあった怖い話
○○大学の本当にあった怖い話○○大学の本当にあった怖い話
○○大学の本当にあった怖い話
 
History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法
History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法
History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法
 
Java x Groovy: improve your java development life
Java x Groovy: improve your java development lifeJava x Groovy: improve your java development life
Java x Groovy: improve your java development life
 
どこでも動くゲームを作るためのベタープラクティス
どこでも動くゲームを作るためのベタープラクティスどこでも動くゲームを作るためのベタープラクティス
どこでも動くゲームを作るためのベタープラクティス
 
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
 
TypeScript と Visual Studio Code
TypeScript と Visual Studio CodeTypeScript と Visual Studio Code
TypeScript と Visual Studio Code
 
WebSocket+Akka(Remote)+Play 2.1 Java
WebSocket+Akka(Remote)+Play 2.1 JavaWebSocket+Akka(Remote)+Play 2.1 Java
WebSocket+Akka(Remote)+Play 2.1 Java
 
これからの「言語」の話をしよう ―― 未来を生きるためのツール
これからの「言語」の話をしよう ―― 未来を生きるためのツールこれからの「言語」の話をしよう ―― 未来を生きるためのツール
これからの「言語」の話をしよう ―― 未来を生きるためのツール
 
Javaセキュアコーディングセミナー東京第3回講義
Javaセキュアコーディングセミナー東京第3回講義Javaセキュアコーディングセミナー東京第3回講義
Javaセキュアコーディングセミナー東京第3回講義
 
197x Timer with Your Messages
197x Timer with Your Messages197x Timer with Your Messages
197x Timer with Your Messages
 
Python Kyoto study
Python Kyoto studyPython Kyoto study
Python Kyoto study
 
Shibuya JVM Groovy 20150418
Shibuya JVM Groovy 20150418Shibuya JVM Groovy 20150418
Shibuya JVM Groovy 20150418
 
ゲーム開発初心者の僕がUnity + WebSocketで何か作ってみた
ゲーム開発初心者の僕がUnity + WebSocketで何か作ってみたゲーム開発初心者の僕がUnity + WebSocketで何か作ってみた
ゲーム開発初心者の僕がUnity + WebSocketで何か作ってみた
 
Lisp tutorial for Pythonista : Day 1
Lisp tutorial for Pythonista : Day 1Lisp tutorial for Pythonista : Day 1
Lisp tutorial for Pythonista : Day 1
 
Nginx lua
Nginx luaNginx lua
Nginx lua
 
"今" 押さえておきたい! Web アプリ開発の技術トレンドとツールの進化
"今" 押さえておきたい! Web アプリ開発の技術トレンドとツールの進化"今" 押さえておきたい! Web アプリ開発の技術トレンドとツールの進化
"今" 押さえておきたい! Web アプリ開発の技術トレンドとツールの進化
 
Go言語入門者が Webアプリケーション を作ってみた話 #devfest #gdgkyoto
Go言語入門者が Webアプリケーション を作ってみた話 #devfest #gdgkyotoGo言語入門者が Webアプリケーション を作ってみた話 #devfest #gdgkyoto
Go言語入門者が Webアプリケーション を作ってみた話 #devfest #gdgkyoto
 

Mehr von Tomohiro Kumagai

最近気づいた勉強法 — 勉強会開催の習慣化 #yumemi_grow
最近気づいた勉強法 — 勉強会開催の習慣化 #yumemi_grow最近気づいた勉強法 — 勉強会開催の習慣化 #yumemi_grow
最近気づいた勉強法 — 勉強会開催の習慣化 #yumemi_growTomohiro Kumagai
 
Swift 所有権 要諦 #ゆるちとせ
Swift 所有権 要諦 #ゆるちとせSwift 所有権 要諦 #ゆるちとせ
Swift 所有権 要諦 #ゆるちとせTomohiro Kumagai
 
_Function Builders in Swift #love_swift
_Function Builders in Swift #love_swift_Function Builders in Swift #love_swift
_Function Builders in Swift #love_swiftTomohiro Kumagai
 
Property Wrappers の特徴を眺める #swiftzoomin
Property Wrappers の特徴を眺める #swiftzoominProperty Wrappers の特徴を眺める #swiftzoomin
Property Wrappers の特徴を眺める #swiftzoominTomohiro Kumagai
 
みんなで 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′ オープニング&資料Tomohiro Kumagai
 
みんなで Swift 復習会
GO! in 札幌 – 10th′′
みんなで Swift 復習会
GO! in 札幌 – 10th′′みんなで Swift 復習会
GO! in 札幌 – 10th′′
みんなで Swift 復習会
GO! in 札幌 – 10th′′Tomohiro Kumagai
 
イニシャライザー Part 2.5 #hakataswift
イニシャライザー Part 2.5 #hakataswiftイニシャライザー Part 2.5 #hakataswift
イニシャライザー Part 2.5 #hakataswiftTomohiro Kumagai
 
ニコニコ超会議・文化の交差点 #techpub #ニコニコ超会議 #さくらシンデレラ
ニコニコ超会議・文化の交差点 #techpub #ニコニコ超会議 #さくらシンデレラニコニコ超会議・文化の交差点 #techpub #ニコニコ超会議 #さくらシンデレラ
ニコニコ超会議・文化の交差点 #techpub #ニコニコ超会議 #さくらシンデレラTomohiro Kumagai
 
Swift クラスのイニシャライザー #devsap
Swift クラスのイニシャライザー #devsapSwift クラスのイニシャライザー #devsap
Swift クラスのイニシャライザー #devsapTomohiro Kumagai
 
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_swiftTomohiro Kumagai
 
Around the 変数 let #love_swift
Around the 変数 let #love_swiftAround the 変数 let #love_swift
Around the 変数 let #love_swiftTomohiro Kumagai
 
もくもく執筆会 #技術同人誌再販Night
もくもく執筆会 #技術同人誌再販Nightもくもく執筆会 #技術同人誌再販Night
もくもく執筆会 #技術同人誌再販NightTomohiro Kumagai
 
みんなで Swift 復習会 GO! in 岩手 – 9th′
みんなで Swift 復習会 GO! in 岩手 – 9th′みんなで Swift 復習会 GO! in 岩手 – 9th′
みんなで Swift 復習会 GO! in 岩手 – 9th′Tomohiro Kumagai
 
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 #hakataswiftTomohiro Kumagai
 
みんなで 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_swiftTomohiro Kumagai
 
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 #iosconTomohiro Kumagai
 
みんなで Swift 復習会
GO! in 京都 – 6th′
みんなで Swift 復習会
GO! in 京都 – 6th′みんなで Swift 復習会
GO! in 京都 – 6th′
みんなで Swift 復習会
GO! in 京都 – 6th′Tomohiro Kumagai
 
みんなで Swift 復習会 GO! in 福岡 – 5th′
みんなで Swift 復習会 GO! in 福岡 – 5th′みんなで Swift 復習会 GO! in 福岡 – 5th′
みんなで Swift 復習会 GO! in 福岡 – 5th′Tomohiro Kumagai
 
勉強会の東京外開催の気持ち #yuru_bounen2017
勉強会の東京外開催の気持ち #yuru_bounen2017勉強会の東京外開催の気持ち #yuru_bounen2017
勉強会の東京外開催の気持ち #yuru_bounen2017Tomohiro Kumagai
 
みんなで Swift 復習会 GO! in 福岡・発表資料
みんなで Swift 復習会 GO! in 福岡・発表資料みんなで Swift 復習会 GO! in 福岡・発表資料
みんなで Swift 復習会 GO! in 福岡・発表資料Tomohiro Kumagai
 

Mehr von 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 福岡・発表資料
 

プロトコル指向に想う世界観 #__swift__