SlideShare a Scribd company logo
1 of 44
Download to read offline
探検!SwiftyJSON
2015/12/20
ezura
自己紹介
• 繪面 友香
• Trifort 勤務の iOS アプリエンジニア (Objective-C)
• Swift とは最近遊び始めました
• Swift その2 Advent Calendar 書きました

Swift 全予約語 (81語) の解説 (Qiita)
• 会社の新卒ブログで今回の発表の内容の一部を書きました

https://trifort.jp/blog/development/
%E6%8E%A2%E6%A4%9C%EF%BC%81swiftyjson-
%E5%89%8D%E7%B7%A8/

(有給 2 日間取得して会社で)
SwiftyJSON と私
• Swift らしいコードってなんだろう
• 他の人のコードを見てみよう
• SwiftyJSON が有名だし、短くて読みやすそう

(使ったことないけど)
• うわぁ、なんかプロトコル実装しまくってる…
• SequenceType? Swift tutorial でちょっと見たなぁ。配列とか辞書
とかの印象…。結局何だったんだっけ

▂▅▇█▓▒░(’ω’)░▒▓█▇▅▂うわああああああ
SwiftyJSON >> 私
• SequenceType、CollectionType…。全てが繋
がった…。なんて美しい世界なんだ

• ここにも、ああ、ここにもプロトコルが (’ω’)

今回の発表の趣旨
• SwiftyJSON を読んでみたら、曖昧に理解して
いたプロトコルの輪郭が見えてきた気がする
• 主要な部分の側だけ模倣して作ってみたら

理解が深まったし、楽しかった
みんなで SwiftyJSON の外側を作ってみよう
SwiftyJSON ?
SwiftyJSON とは
JSON 内の値のアクセスを簡単にしてくれる
ライブラリ
NSJSONSerialization
{"batchcomplete":"","query":{"normalized":[{"from":"swift","to":"Swift"}],"pages":
{"927971":{"pageid":927971,"ns":0,"title":"Swift"}}}}
AnyObject
let	
  json	
  =	
  try	
  NSJSONSerialization.JSONObjectWithData(data,

	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  options:	
  NSJSONReadingOptions.MutableContainers)	
  
if	
  let	
  query	
  =	
  json["query"]	
  as?	
  NSDictionary	
  {	
  
	
  	
  	
  	
  if	
  let	
  normalized	
  =	
  query["normalized"]	
  as?	
  NSArray	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  if	
  let	
  firstNormarized	
  =	
  normalized[0]	
  as?	
  NSDictionary	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  if	
  let	
  to	
  =	
  firstNormarized["to"]	
  as?	
  String	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  //	
  取り出せた!	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  }	
  
	
  	
  	
  	
  	
  	
  	
  	
  }	
  
	
  	
  	
  	
  }	
  
}
{"batchcomplete":"","query":{"normalized":[{"from":"swift","to":"Swift"}],"pages":
{"927971":{"pageid":927971,"ns":0,"title":"Swift"}}}}
AnyObject	
  型
import	
  SwiftyJSON	
  
let	
  json	
  =	
  JSON(data:data)





if	
  let	
  normarizedKeyword	
  =	
  json[“query"]["normalized"][0]["to"]



	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  .string	
  {	
  ...	
  }
{"batchcomplete":"","query":{"normalized":[{"from":"swift","to":"Swift"}],"pages":
{"927971":{"pageid":927971,"ns":0,"title":"Swift"}}}}
JSON	
  型
String	
  型 JSON	
  型
ところで・・・
 json["query",	
  "normalized",	
  0,	
  “to"]
let	
  json	
  =	
  JSON(["sample":	
  [1,	
  "a",	
  true],	
  "str":	
  "abc"])	
  
json["sample"]
json.map({	
  $0	
  })	
  
json.first	
  
for	
  element	
  in	
  json	
  {	
  print(element)	
  }
let	
  jsonStr:JSON	
  =	
  "aaa"	
  
let	
  jsonBool:JSON	
  =	
  true

for	
  element	
  in	
  jsonBool	
  {	
  print(element)	
  }	
  	
  //	
  エラーでない
if	
  (json)	
  {}
JSON	
  型
JSON	
  型
struct	
  SampleStruct	
  {}	
  
let	
  sampleStruct	
  =	
  SampleStruct()	
  
sampleStruct["sample"]	
  	
  	
  	
  //	
  エラー

sampleStruct[“sample"]["sample"]	
  //	
  エラー	
  
sampleStruct.map({	
  $0	
  })	
  	
  //	
  エラー	
  
sampleStruct.first	
  	
  	
  	
  	
  	
  	
  	
  //	
  エラー

for	
  _	
  in	
  sampleStruct.startIndex	
  ..<	
  
sampleStruct.endIndex	
  {}	
  	
  //	
  エラー

for	
  element	
  in	
  sampleStruct	
  {	
  print(element)	
  }	
  //	
  エラー	
  
if	
  (sampleStruct)	
  {}	
  	
  	
  	
  	
  	
  //	
  エラー
JSON 型は何者?
本編
ここまでのあらすじ
• JSON は複数の型を含む
• NSJSONSerialization でパースするとAnyObject 型が返ってくる
• 要素へのアクセス毎にキャストする必要がある
• SwiftyJSON
• 途中のキャスト不要
• Array 型や Dictionary 型のような動作
• Bool 型のような動作
JSON 型は何者?
構成
• 動作から処理を追ってみる + 

JSON 型の動作を実装してみる

• プロトコルについて考察
• 基本構文やシンタックスシュガーに隠れたプロトコル
• SequenceType, CollectionType から学ぶ、プロトコ
ルの設計
構成
• 動作から処理を追ってみる + 

JSON 型の動作を実装してみる

• プロトコルについて考察
• 基本構文やシンタックスシュガーに隠れたプロトコル
• SequenceType, CollectionType から学ぶ、プロトコ
ルの設計
動作から処理を追ってみよう
ここまでのあらすじ
• JSON は複数の型を含む
• NSJSONSerialization でパースするとAnyObject 型が返ってくる
• 要素へのアクセス毎にキャストする必要がある
• SwiftyJSON
• 途中のキャスト不要
• Array 型や Dictionary 型のような動作
• Bool 型のような動作
内部でキャスト
プロトコル実装 +

渡されたオブジェクトの型毎に

処理分岐
内部でキャスト
switch	
  newValue	
  {	
  
case	
  let	
  number	
  as	
  NSNumber:	
  
	
  	
  	
  	
  if	
  number.isBool	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  _type	
  =	
  .Bool	
  
	
  	
  	
  	
  }	
  else	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  _type	
  =	
  .Number	
  
	
  	
  	
  	
  }	
  
	
  	
  	
  	
  self.rawNumber	
  =	
  number	
  
case	
  	
  let	
  string	
  as	
  String:	
  
	
  	
  	
  	
  _type	
  =	
  .String	
  
	
  	
  	
  	
  self.rawString	
  =	
  string	
  
case	
  	
  _	
  as	
  NSNull:	
  
	
  	
  	
  	
  _type	
  =	
  .Null	
  
case	
  let	
  array	
  as	
  [AnyObject]:	
  
	
  	
  	
  	
  _type	
  =	
  .Array	
  
	
  	
  	
  	
  self.rawArray	
  =	
  array	
  
case	
  let	
  dictionary	
  as	
  [String	
  :	
  AnyObject]:	
  
	
  	
  	
  	
  _type	
  =	
  .Dictionary	
  
	
  	
  	
  	
  self.rawDictionary	
  =	
  dictionary
動作のお話
 json["query",	
  "normalized",	
  0,	
  “to"]
let	
  json	
  =	
  JSON(["sample":	
  [1,	
  "a",	
  true],	
  "str":	
  "abc"])	
  
json["sample"]
json.map({	
  $0	
  })	
  
json.first	
  
for	
  element	
  in	
  json	
  {	
  print(element)	
  }
if	
  (json)	
  {}
struct	
  SampleStruct	
  {	
  
	
  	
  	
  	
  var	
  object:AnyObject?	
  
}	
  
//	
  ここに実装を追加していきます	
  
let	
  sampleStruct	
  =	
  SampleStruct()	
  
//	
  以下は今の状態では全てエラーです	
  
sampleStruct["sample"]	
  
sampleStruct["sample"]["sample"]	
  
sampleStruct.map({	
  $0	
  })	
  
for	
  element	
  in	
  sampleStruct	
  {	
  print(element)	
  }	
  
sampleStruct.first

for	
  _	
  in	
  sampleStruct.startIndex	
  ..<	
  sampleStruct.endIndex	
  {}	
  
if	
  (sampleStruct)	
  {}	
  
while	
  (!sampleStruct)	
  {}
subscript

json[“sample”], json[0]
private	
  subscript(key	
  key:	
  String)	
  -­‐>	
  JSON	
  {	
  
	
  	
  	
  	
  get	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  var	
  r	
  =	
  JSON.null	
  
	
  	
  	
  	
  	
  	
  	
  	
  if	
  self.type	
  ==	
  .Dictionary	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  if	
  let	
  o	
  =	
  self.rawDictionary[key]	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  r	
  =	
  JSON(o)	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  }	
  else	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  r._error	
  =	
  NSError(domain:	
  ErrorDomain,	
  code:	
  
ErrorNotExist,	
  userInfo:	
  [NSLocalizedDescriptionKey:	
  
"Dictionary["(key)"]	
  does	
  not	
  exist"])	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  }	
  
//	
  以下略
SequenceType

json.map({ $0 }), for var element in json
protocol	
  SequenceType	
  {	
  
	
  	
  	
  	
  typealias	
  Generator	
  :	
  GeneratorType	
  
	
  	
  	
  	
  public	
  func	
  generate()	
  -­‐>	
  Self.Generator	
  
}	
  
struct	
  SampleGenerator	
  :	
  GeneratorType	
  {	
  
	
  	
  	
  	
  typealias	
  Element	
  
	
  	
  	
  	
  mutating	
  func	
  next()	
  -­‐>	
  Self.Element?	
  
}
SequenceType

json.map({ $0 }), for var element in json
• プロトコル
• 機能: 次の要素へのアクセスと遷移ができる
let	
  array	
  =	
  [1,	
  2,	
  3]	
  
array.map({	
  $0	
  })	
  
for	
  var	
  element	
  in	
  array	
  {}
SequenceType

json.map({ $0 }), for var element in json
• プロトコル
• 機能: 次の要素へのアクセスと遷移ができる
1 を

返す状態
2 を

返す状態
3 を

返す状態
nil
next next next
SequenceType

json.map({ $0 }), for var element in json
protocol	
  SequenceType	
  {	
  
	
  	
  	
  	
  typealias	
  Generator	
  :	
  GeneratorType	
  
	
  	
  	
  	
  public	
  func	
  generate()	
  -­‐>	
  Self.Generator	
  
}	
  


//	
  イテレータのようなもの	
  
struct	
  SampleGenerator	
  :	
  GeneratorType	
  {	
  
	
  	
  	
  	
  typealias	
  Element	
  
	
  	
  	
  	
  mutating	
  func	
  next()	
  -­‐>	
  Self.Element?	
  
}
CollectionType

json.first, 

for _ in sampleStruct.startIndex ..<
sampleStruct.endIndex {}
protocol	
  CollectionType	
  {	
  
	
  	
  	
  	
  typealias	
  Index	
  
	
  	
  	
  	
  var	
  startIndex:	
  Self.Index	
  
	
  	
  	
  	
  var	
  endIndex:	
  Self.Index	
  
	
  	
  	
  	
  subscript(i:	
  Self.Index)	
  -­‐>	
  Self.Generator.Element	
  	
  	
  	
  	
  
}
1 を

返す状態
2 を

返す状態
3 を

返す状態
nil
next next next
SequenceType	
  を継承したプロトコル
startIndex endIndex[1]
BooleanType

if(…), while(…), for(;…;), case …
protocol	
  BooleanType	
  {	
  
	
  	
  	
  	
  var	
  boolValue:	
  Bool	
  {	
  get	
  }	
  
}
• プロトコル
• 機能: 真偽値を表現
そういえば…
ここまでのあらすじ
• JSON は複数の型を含む
• NSJSONSerialization でパースするとAnyObject 型が返ってくる
• 要素へのアクセス毎にキャストする必要がある
• SwiftyJSON
• 途中のキャスト不要
• Array 型や Dictionary 型のような動作
• Bool 型のような動作
内部でキャスト
違和感
プロトコル実装 +

渡されたオブジェクトの型毎に

処理分岐
感じましたか
プロトコルを
配列や辞書だから

for in を使えるのではない
真偽値だから、

if 文の中で使えるのではない
プロトコルが実装されている
から使える
プロトコルが示す性質を持つ
ことで機能を実現できる
Protocol Oriented
Protocol Oriented ?
ありがとう

SwiftyJSON
(次は functional swift について学びたいです)
参考
• SwiftyJSON

(https://github.com/SwiftyJSON/
SwiftyJSON) 

licence:

https://github.com/SwiftyJSON/SwiftyJSON/
blob/master/LICENSE

More Related Content

What's hot

Swift らしい表現を目指そう #eventdots
Swift らしい表現を目指そう #eventdotsSwift らしい表現を目指そう #eventdots
Swift らしい表現を目指そう #eventdotsTomohiro Kumagai
 
速くなければスマフォじゃない - インターンバージョン-
速くなければスマフォじゃない - インターンバージョン-速くなければスマフォじゃない - インターンバージョン-
速くなければスマフォじゃない - インターンバージョン-Kazunari Hara
 
JavaScript超入門 基礎
JavaScript超入門 基礎JavaScript超入門 基礎
JavaScript超入門 基礎tetsu6
 
クロージャデザインパターン
クロージャデザインパターンクロージャデザインパターン
クロージャデザインパターンMoriharu Ohzu
 
プロトコル指向 - 夢と現実の狭間 #cswift
プロトコル指向 - 夢と現実の狭間 #cswiftプロトコル指向 - 夢と現実の狭間 #cswift
プロトコル指向 - 夢と現実の狭間 #cswiftTomohiro Kumagai
 
ノンプログラマーでも明日から使えるJavaScript簡単プログラム 先生:柳井 政和
ノンプログラマーでも明日から使えるJavaScript簡単プログラム 先生:柳井 政和ノンプログラマーでも明日から使えるJavaScript簡単プログラム 先生:柳井 政和
ノンプログラマーでも明日から使えるJavaScript簡単プログラム 先生:柳井 政和schoowebcampus
 
JavaScriptの落とし穴
JavaScriptの落とし穴JavaScriptの落とし穴
JavaScriptの落とし穴ikdysfm
 
Frege, What a Non-strict Language
Frege, What a Non-strict LanguageFrege, What a Non-strict Language
Frege, What a Non-strict Languagey_taka_23
 
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
 
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~Fujio Kojima
 
C# LINQ ~深く知って、使いまくろう~
C# LINQ ~深く知って、使いまくろう~C# LINQ ~深く知って、使いまくろう~
C# LINQ ~深く知って、使いまくろう~Fujio Kojima
 
メタプログラミング C#
メタプログラミング C#メタプログラミング C#
メタプログラミング C#Fujio Kojima
 
Swift 3 を書くときに知っておきたい API デザインガイドライン #love_swift #akibaswift
Swift 3 を書くときに知っておきたい API デザインガイドライン #love_swift #akibaswiftSwift 3 を書くときに知っておきたい API デザインガイドライン #love_swift #akibaswift
Swift 3 を書くときに知っておきたい API デザインガイドライン #love_swift #akibaswiftTomohiro Kumagai
 
J qmobiはjqueryから軽量化しているか
J qmobiはjqueryから軽量化しているかJ qmobiはjqueryから軽量化しているか
J qmobiはjqueryから軽量化しているかHisashi Aruji
 
Sns suite presentation
Sns suite presentationSns suite presentation
Sns suite presentationJason Namkung
 
unique_ptrにポインタ以外のものを持たせるとき
unique_ptrにポインタ以外のものを持たせるときunique_ptrにポインタ以外のものを持たせるとき
unique_ptrにポインタ以外のものを持たせるときShintarou Okada
 
Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2Ransui Iso
 
C++ マルチスレッドプログラミング
C++ マルチスレッドプログラミングC++ マルチスレッドプログラミング
C++ マルチスレッドプログラミングKohsuke Yuasa
 

What's hot (20)

Swift らしい表現を目指そう #eventdots
Swift らしい表現を目指そう #eventdotsSwift らしい表現を目指そう #eventdots
Swift らしい表現を目指そう #eventdots
 
速くなければスマフォじゃない - インターンバージョン-
速くなければスマフォじゃない - インターンバージョン-速くなければスマフォじゃない - インターンバージョン-
速くなければスマフォじゃない - インターンバージョン-
 
JavaScript超入門 基礎
JavaScript超入門 基礎JavaScript超入門 基礎
JavaScript超入門 基礎
 
クロージャデザインパターン
クロージャデザインパターンクロージャデザインパターン
クロージャデザインパターン
 
プロトコル指向 - 夢と現実の狭間 #cswift
プロトコル指向 - 夢と現実の狭間 #cswiftプロトコル指向 - 夢と現実の狭間 #cswift
プロトコル指向 - 夢と現実の狭間 #cswift
 
ノンプログラマーでも明日から使えるJavaScript簡単プログラム 先生:柳井 政和
ノンプログラマーでも明日から使えるJavaScript簡単プログラム 先生:柳井 政和ノンプログラマーでも明日から使えるJavaScript簡単プログラム 先生:柳井 政和
ノンプログラマーでも明日から使えるJavaScript簡単プログラム 先生:柳井 政和
 
JavaScriptの落とし穴
JavaScriptの落とし穴JavaScriptの落とし穴
JavaScriptの落とし穴
 
jQuery超入門編
jQuery超入門編jQuery超入門編
jQuery超入門編
 
Frege, What a Non-strict Language
Frege, What a Non-strict LanguageFrege, What a Non-strict Language
Frege, What a Non-strict Language
 
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
 
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
 
C# LINQ ~深く知って、使いまくろう~
C# LINQ ~深く知って、使いまくろう~C# LINQ ~深く知って、使いまくろう~
C# LINQ ~深く知って、使いまくろう~
 
Ajax 応用
Ajax 応用Ajax 応用
Ajax 応用
 
メタプログラミング C#
メタプログラミング C#メタプログラミング C#
メタプログラミング C#
 
Swift 3 を書くときに知っておきたい API デザインガイドライン #love_swift #akibaswift
Swift 3 を書くときに知っておきたい API デザインガイドライン #love_swift #akibaswiftSwift 3 を書くときに知っておきたい API デザインガイドライン #love_swift #akibaswift
Swift 3 を書くときに知っておきたい API デザインガイドライン #love_swift #akibaswift
 
J qmobiはjqueryから軽量化しているか
J qmobiはjqueryから軽量化しているかJ qmobiはjqueryから軽量化しているか
J qmobiはjqueryから軽量化しているか
 
Sns suite presentation
Sns suite presentationSns suite presentation
Sns suite presentation
 
unique_ptrにポインタ以外のものを持たせるとき
unique_ptrにポインタ以外のものを持たせるときunique_ptrにポインタ以外のものを持たせるとき
unique_ptrにポインタ以外のものを持たせるとき
 
Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2
 
C++ マルチスレッドプログラミング
C++ マルチスレッドプログラミングC++ マルチスレッドプログラミング
C++ マルチスレッドプログラミング
 

Similar to 探検!SwiftyJSON

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
 
JavaのGenericsとは?
JavaのGenericsとは?JavaのGenericsとは?
JavaのGenericsとは?Kenji Nakamura
 
第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」yoshiaki iwanaga
 
Unit testing JavaScript with JUnit/JavaFX
Unit testing JavaScript with JUnit/JavaFXUnit testing JavaScript with JUnit/JavaFX
Unit testing JavaScript with JUnit/JavaFXShinya Mochida
 
JavaScriptおよびXPages Vote技術解説
JavaScriptおよびXPages Vote技術解説JavaScriptおよびXPages Vote技術解説
JavaScriptおよびXPages Vote技術解説賢次 海老原
 
TypeScript 1.0 オーバービュー
TypeScript 1.0 オーバービューTypeScript 1.0 オーバービュー
TypeScript 1.0 オーバービューAkira Inoue
 
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
 
【Topotal輪読会】JavaScript で学ぶ関数型プログラミング 2 章
【Topotal輪読会】JavaScript で学ぶ関数型プログラミング 2 章【Topotal輪読会】JavaScript で学ぶ関数型プログラミング 2 章
【Topotal輪読会】JavaScript で学ぶ関数型プログラミング 2 章YOSHIKAWA Ryota
 
20110714 j queryベーシック
20110714 j queryベーシック20110714 j queryベーシック
20110714 j queryベーシック良太 増子
 
Clojure programming-chapter-2
Clojure programming-chapter-2Clojure programming-chapter-2
Clojure programming-chapter-2Masao Kato
 
JavaScriptCore.framework の普通な使い方 #cocoa_kansai
JavaScriptCore.framework の普通な使い方 #cocoa_kansaiJavaScriptCore.framework の普通な使い方 #cocoa_kansai
JavaScriptCore.framework の普通な使い方 #cocoa_kansaiTomohiro Kumagai
 
15分でざっくり分かるScala入門
15分でざっくり分かるScala入門15分でざっくり分かるScala入門
15分でざっくり分かるScala入門SatoYu1ro
 

Similar to 探検!SwiftyJSON (20)

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
 
たのしい関数型
たのしい関数型たのしい関数型
たのしい関数型
 
JavaのGenericsとは?
JavaのGenericsとは?JavaのGenericsとは?
JavaのGenericsとは?
 
第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」
 
Unit testing JavaScript with JUnit/JavaFX
Unit testing JavaScript with JUnit/JavaFXUnit testing JavaScript with JUnit/JavaFX
Unit testing JavaScript with JUnit/JavaFX
 
JavaScriptおよびXPages Vote技術解説
JavaScriptおよびXPages Vote技術解説JavaScriptおよびXPages Vote技術解説
JavaScriptおよびXPages Vote技術解説
 
TypeScript 1.0 オーバービュー
TypeScript 1.0 オーバービューTypeScript 1.0 オーバービュー
TypeScript 1.0 オーバービュー
 
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
 
【Topotal輪読会】JavaScript で学ぶ関数型プログラミング 2 章
【Topotal輪読会】JavaScript で学ぶ関数型プログラミング 2 章【Topotal輪読会】JavaScript で学ぶ関数型プログラミング 2 章
【Topotal輪読会】JavaScript で学ぶ関数型プログラミング 2 章
 
Ll xcode
Ll xcodeLl xcode
Ll xcode
 
Cubby 2006-08-23
Cubby 2006-08-23Cubby 2006-08-23
Cubby 2006-08-23
 
APIKit
APIKitAPIKit
APIKit
 
Teclab3
Teclab3Teclab3
Teclab3
 
20150302 java8 第一回_ラムダ式(1)
20150302 java8 第一回_ラムダ式(1)20150302 java8 第一回_ラムダ式(1)
20150302 java8 第一回_ラムダ式(1)
 
20110714 j queryベーシック
20110714 j queryベーシック20110714 j queryベーシック
20110714 j queryベーシック
 
Clojure programming-chapter-2
Clojure programming-chapter-2Clojure programming-chapter-2
Clojure programming-chapter-2
 
JavaScriptCore.framework の普通な使い方 #cocoa_kansai
JavaScriptCore.framework の普通な使い方 #cocoa_kansaiJavaScriptCore.framework の普通な使い方 #cocoa_kansai
JavaScriptCore.framework の普通な使い方 #cocoa_kansai
 
Swiftおさらい
SwiftおさらいSwiftおさらい
Swiftおさらい
 
Project lambda
Project lambdaProject lambda
Project lambda
 
15分でざっくり分かるScala入門
15分でざっくり分かるScala入門15分でざっくり分かるScala入門
15分でざっくり分かるScala入門
 

Recently uploaded

TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案sugiuralab
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)UEHARA, Tetsutaro
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineerYuki Kikuchi
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...博三 太田
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成Hiroshi Tomioka
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?akihisamiyanaga1
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfFumieNakayama
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfFumieNakayama
 

Recently uploaded (9)

TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
 

探検!SwiftyJSON

  • 2. 自己紹介 • 繪面 友香 • Trifort 勤務の iOS アプリエンジニア (Objective-C) • Swift とは最近遊び始めました • Swift その2 Advent Calendar 書きました
 Swift 全予約語 (81語) の解説 (Qiita) • 会社の新卒ブログで今回の発表の内容の一部を書きました
 https://trifort.jp/blog/development/ %E6%8E%A2%E6%A4%9C%EF%BC%81swiftyjson- %E5%89%8D%E7%B7%A8/
 (有給 2 日間取得して会社で)
  • 3. SwiftyJSON と私 • Swift らしいコードってなんだろう • 他の人のコードを見てみよう • SwiftyJSON が有名だし、短くて読みやすそう
 (使ったことないけど) • うわぁ、なんかプロトコル実装しまくってる… • SequenceType? Swift tutorial でちょっと見たなぁ。配列とか辞書 とかの印象…。結局何だったんだっけ
 ▂▅▇█▓▒░(’ω’)░▒▓█▇▅▂うわああああああ
  • 4. SwiftyJSON >> 私 • SequenceType、CollectionType…。全てが繋 がった…。なんて美しい世界なんだ
 • ここにも、ああ、ここにもプロトコルが (’ω’)

  • 5. 今回の発表の趣旨 • SwiftyJSON を読んでみたら、曖昧に理解して いたプロトコルの輪郭が見えてきた気がする • 主要な部分の側だけ模倣して作ってみたら
 理解が深まったし、楽しかった みんなで SwiftyJSON の外側を作ってみよう
  • 9. let  json  =  try  NSJSONSerialization.JSONObjectWithData(data,
                              options:  NSJSONReadingOptions.MutableContainers)   if  let  query  =  json["query"]  as?  NSDictionary  {          if  let  normalized  =  query["normalized"]  as?  NSArray  {                  if  let  firstNormarized  =  normalized[0]  as?  NSDictionary  {                          if  let  to  =  firstNormarized["to"]  as?  String  {                                  //  取り出せた!                          }                  }          }   } {"batchcomplete":"","query":{"normalized":[{"from":"swift","to":"Swift"}],"pages": {"927971":{"pageid":927971,"ns":0,"title":"Swift"}}}} AnyObject  型
  • 10. import  SwiftyJSON   let  json  =  JSON(data:data)
 
 
 if  let  normarizedKeyword  =  json[“query"]["normalized"][0]["to"]
 
                                                      .string  {  ...  } {"batchcomplete":"","query":{"normalized":[{"from":"swift","to":"Swift"}],"pages": {"927971":{"pageid":927971,"ns":0,"title":"Swift"}}}} JSON  型 String  型 JSON  型
  • 12.  json["query",  "normalized",  0,  “to"] let  json  =  JSON(["sample":  [1,  "a",  true],  "str":  "abc"])   json["sample"] json.map({  $0  })   json.first   for  element  in  json  {  print(element)  } let  jsonStr:JSON  =  "aaa"   let  jsonBool:JSON  =  true
 for  element  in  jsonBool  {  print(element)  }    //  エラーでない if  (json)  {} JSON  型 JSON  型
  • 13. struct  SampleStruct  {}   let  sampleStruct  =  SampleStruct()   sampleStruct["sample"]        //  エラー
 sampleStruct[“sample"]["sample"]  //  エラー   sampleStruct.map({  $0  })    //  エラー   sampleStruct.first                //  エラー
 for  _  in  sampleStruct.startIndex  ..<   sampleStruct.endIndex  {}    //  エラー
 for  element  in  sampleStruct  {  print(element)  }  //  エラー   if  (sampleStruct)  {}            //  エラー
  • 16. ここまでのあらすじ • JSON は複数の型を含む • NSJSONSerialization でパースするとAnyObject 型が返ってくる • 要素へのアクセス毎にキャストする必要がある • SwiftyJSON • 途中のキャスト不要 • Array 型や Dictionary 型のような動作 • Bool 型のような動作
  • 18. 構成 • 動作から処理を追ってみる + 
 JSON 型の動作を実装してみる
 • プロトコルについて考察 • 基本構文やシンタックスシュガーに隠れたプロトコル • SequenceType, CollectionType から学ぶ、プロトコ ルの設計
  • 19. 構成 • 動作から処理を追ってみる + 
 JSON 型の動作を実装してみる
 • プロトコルについて考察 • 基本構文やシンタックスシュガーに隠れたプロトコル • SequenceType, CollectionType から学ぶ、プロトコ ルの設計
  • 21. ここまでのあらすじ • JSON は複数の型を含む • NSJSONSerialization でパースするとAnyObject 型が返ってくる • 要素へのアクセス毎にキャストする必要がある • SwiftyJSON • 途中のキャスト不要 • Array 型や Dictionary 型のような動作 • Bool 型のような動作 内部でキャスト プロトコル実装 +
 渡されたオブジェクトの型毎に
 処理分岐
  • 22. 内部でキャスト switch  newValue  {   case  let  number  as  NSNumber:          if  number.isBool  {                  _type  =  .Bool          }  else  {                  _type  =  .Number          }          self.rawNumber  =  number   case    let  string  as  String:          _type  =  .String          self.rawString  =  string   case    _  as  NSNull:          _type  =  .Null   case  let  array  as  [AnyObject]:          _type  =  .Array          self.rawArray  =  array   case  let  dictionary  as  [String  :  AnyObject]:          _type  =  .Dictionary          self.rawDictionary  =  dictionary
  • 24.  json["query",  "normalized",  0,  “to"] let  json  =  JSON(["sample":  [1,  "a",  true],  "str":  "abc"])   json["sample"] json.map({  $0  })   json.first   for  element  in  json  {  print(element)  } if  (json)  {}
  • 25. struct  SampleStruct  {          var  object:AnyObject?   }   //  ここに実装を追加していきます   let  sampleStruct  =  SampleStruct()   //  以下は今の状態では全てエラーです   sampleStruct["sample"]   sampleStruct["sample"]["sample"]   sampleStruct.map({  $0  })   for  element  in  sampleStruct  {  print(element)  }   sampleStruct.first
 for  _  in  sampleStruct.startIndex  ..<  sampleStruct.endIndex  {}   if  (sampleStruct)  {}   while  (!sampleStruct)  {}
  • 26. subscript
 json[“sample”], json[0] private  subscript(key  key:  String)  -­‐>  JSON  {          get  {                  var  r  =  JSON.null                  if  self.type  ==  .Dictionary  {                          if  let  o  =  self.rawDictionary[key]  {                                  r  =  JSON(o)                          }  else  {                                  r._error  =  NSError(domain:  ErrorDomain,  code:   ErrorNotExist,  userInfo:  [NSLocalizedDescriptionKey:   "Dictionary["(key)"]  does  not  exist"])                          }   //  以下略
  • 27. SequenceType
 json.map({ $0 }), for var element in json protocol  SequenceType  {          typealias  Generator  :  GeneratorType          public  func  generate()  -­‐>  Self.Generator   }   struct  SampleGenerator  :  GeneratorType  {          typealias  Element          mutating  func  next()  -­‐>  Self.Element?   }
  • 28. SequenceType
 json.map({ $0 }), for var element in json • プロトコル • 機能: 次の要素へのアクセスと遷移ができる let  array  =  [1,  2,  3]   array.map({  $0  })   for  var  element  in  array  {}
  • 29. SequenceType
 json.map({ $0 }), for var element in json • プロトコル • 機能: 次の要素へのアクセスと遷移ができる 1 を
 返す状態 2 を
 返す状態 3 を
 返す状態 nil next next next
  • 30. SequenceType
 json.map({ $0 }), for var element in json protocol  SequenceType  {          typealias  Generator  :  GeneratorType          public  func  generate()  -­‐>  Self.Generator   }   
 //  イテレータのようなもの   struct  SampleGenerator  :  GeneratorType  {          typealias  Element          mutating  func  next()  -­‐>  Self.Element?   }
  • 31. CollectionType
 json.first, 
 for _ in sampleStruct.startIndex ..< sampleStruct.endIndex {} protocol  CollectionType  {          typealias  Index          var  startIndex:  Self.Index          var  endIndex:  Self.Index          subscript(i:  Self.Index)  -­‐>  Self.Generator.Element           } 1 を
 返す状態 2 を
 返す状態 3 を
 返す状態 nil next next next SequenceType  を継承したプロトコル startIndex endIndex[1]
  • 32. BooleanType
 if(…), while(…), for(;…;), case … protocol  BooleanType  {          var  boolValue:  Bool  {  get  }   } • プロトコル • 機能: 真偽値を表現
  • 34. ここまでのあらすじ • JSON は複数の型を含む • NSJSONSerialization でパースするとAnyObject 型が返ってくる • 要素へのアクセス毎にキャストする必要がある • SwiftyJSON • 途中のキャスト不要 • Array 型や Dictionary 型のような動作 • Bool 型のような動作 内部でキャスト 違和感 プロトコル実装 +
 渡されたオブジェクトの型毎に
 処理分岐