Slide 1

Slide 1 text

$PEBCMFͰΧΦεͳ+40/ ʹରԠ͍ͯ͘͠ 0UFNBDIJTXJGUOPQQF !OPQQFGPYXPMG

Slide 2

Slide 2 text

OPQQF ! σΟʔɾΤψɾΤʔ " ϥΠϒ഑৴J04ΞϓϦ # ͖ͭͶ͔Θ͍͍ $ 0UFNBDIJTXJGUॳࢀઓ

Slide 3

Slide 3 text

ελϯμʔυͳ+40/

Slide 4

Slide 4 text

$PEBCMFͰϚοϐϯά struct UserData { let id: String } let decoder = JSONDecoder() let userData = try decoder.decode(Response.self, data: data)

Slide 5

Slide 5 text

ੈͷதʹ͸ΧΦεͳ+40/͕͋Δ ࠓ೔͸̎ͭ঺հ

Slide 6

Slide 6 text

ࣄྫ

Slide 7

Slide 7 text

͜ͷ+40/Կ͕͓͔͍͠Ͱ͔͢

Slide 8

Slide 8 text

TOBLF@DBTFͱLFCBC DBTF͕ࠞ߹͍ͯ͠Δʂ

Slide 9

Slide 9 text

TOBLF@DBTFҎ֎͕ࠞͬ͟ ͍ͯΔͱ ,FZ%FDPEJOH4USBUFHZ͕ ࢖͑ͳ͍ʜ

Slide 10

Slide 10 text

,FZ%FDPEJOH4USBUFHZͱ͸ʁ 4XJGUʙ +40/Ωʔ໊ϓϩύςΟ໊ͷϧʔϧΛࢦఆ ͢ΔࣄͰɺCodingKey΍init(from decoder:)Λ࣮૷ͤͣʹϚοϐϯάग़དྷΔ

Slide 11

Slide 11 text

,FZ%FDPEJOH4USBUFHZͱ͸ʁ let decoder = JSONDecoder() decoder.keyDecodingStrategy = .convertFromSnakeCase let obj = try decoder.decode(Response.self, from: data)

Slide 12

Slide 12 text

େৎ෉

Slide 13

Slide 13 text

ΧελϜσίʔυϧʔϧ decoder.keyDecodingStrategy = .custom { keys in let lastComponent = keys.last!.stringValue.camelCase return AnyKey(stringValue: String(lastComponent))! } ΧελϜͳLFZ%FDPEJOH4USBUFHZΛ࡞Δࣄ ͕Ͱ͖Δɻ

Slide 14

Slide 14 text

TOBLF@DBTFPSLFCBCDBTFUP DBNFM$BTF extension String { internal var camelCase: String { return self.replacingOccurrences(of: "-", with: "_") .components(separatedBy: "_") .enumerated() .map { 0 == $0 ? $1 : $1.capitalized } .joined() } }

Slide 15

Slide 15 text

ࣄྫ̎

Slide 16

Slide 16 text

͜ͷ+40/Կ͕͓͔͍͠Ͱ͔͢

Slide 17

Slide 17 text

Slide 18

Slide 18 text

ܕ͕ෆఆ

Slide 19

Slide 19 text

ܕ͕ෆఆ w Ұճ"OZʹ٧ΊͯɺऔΓग़࣌͢ʹܕΛ෇͚ ͯ͋͛Δ w ଘࡏ͠͏Δ͢΂ͯͷϑΟʔϧυΛ࣋ͬͨΦ ϒδΣΫτʹϚοϐϯά͢Δ w %JDUJPOBSZͰ࣋ͭ

Slide 20

Slide 20 text

ܕ͕ෆఆ struct AttachmentObject: Decodable { let value: Any init(from decoder: Decoder) throws { let container = try decoder.singleValueContainer() if let value = try? container.decode(Media.self) { self.value = value } else if let value = try? container.decode([Media].self) { self.value = value } else { preconditionFailure() } } }

Slide 21

Slide 21 text

ܕ͕ෆఆ ࢖͏ͱ͖͸TXJUDIͳͲͰ෼ذ switch object.data.value { case let value as Media: print(value.id) case let value as [Media]: print(value.compactMap({ $0.id })) default: break }

Slide 22

Slide 22 text

! ͳΜ͔ଞʹྑ͍ํ๏͕͋Δؾ͕͢ΔͷͰɺ ஌͍ͬͯΔਓ͕͍ͨΒڭ͍͑ͯͩ͘͞

Slide 23

Slide 23 text

ͦ΋ͦ΋ ͳΜͰ͜ΜͳKTPOύʔεͯ͠Δͷʁʁ

Slide 24

Slide 24 text

HBCBJ "1*ΫϥΠΞϯτϥΠϒϥϦΛ࡞ͬͯ·͢

Slide 25

Slide 25 text

OPQQFGPYXPMG(BC,JU ࠓճͷςΫχοΫͰ࣮૷ͯ͠·͢ HBC·ͩ·ͩ೔ຊਓগͳ͍ͷͰɺڵຯ͋Δਓ ͸࢖ͬͯΈ͍ͯͩ͘͞ʙʙ

Slide 26

Slide 26 text

$JSPOOVQνψϩοϓ HBCDPNͷJ04ωΠςΟϒΞϓϦɻ৹ࠪத

Slide 27

Slide 27 text

͋Γ͕ͱ͏͍͟͝·ͨ͠