Avatar
omochimetaru 4/28/2017 7:13 AM
PR0166い途中まで読んでるけどこれめっちゃ頭いいな
7:14 AM
あるstructが:Encodableに準拠してるとき、
7:14 AM
自動的にプロパティ名と同じcase名をもったenumが定義されて
7:14 AM
そのオブジェクトをエンコードする時のコンテナ(JSON Object)とかにあたるオブジェクト
7:14 AM
に、型パラメータとしてCodingKeyが取れるおかげで
7:15 AM
プロパティ名に対応しないキーを間違って使っちゃう可能性が排除される
7:15 AM
public struct Location : Codable { private enum CodingKeys : CodingKey { case latitude case longitude } public func encode(to encoder: Encoder) throws { // Generic keyed encoder gives type-safe key access: cannot encode with keys of the wrong type. let container = encoder.container(keyedBy: CodingKeys.self) // The encoder is generic on the key -- free key autocompletion here. try container.encode(latitude, forKey: .latitude) try container.encode(longitude, forKey: .longitude) } }
7:17 AM
Encodercontainer メソッドが、 K.Type を引数で受けていて、 container の型パラに引き継がれる。 enum CodingKeysはstruct Locationのinner typeで、Locationのために自動定義されたやつだから、プロパティ名とキーが静的に結びつく