(discord/swift/2018/03/13/1) Codableのtypealiasにstructを使ったtips

概要

  • discord ios dev
    • #swift
    • 2018/03/13
  • Codableのtypealiasにstructを使ったtips

log

omochimetaru - 2018/03/13

ときどき話題に出てくるCodableとJSONの話で、JSON表現用の型とモデルの型をわけて・・・ってパターン、こうやると少し楽になると気づいた

gist.github.com


t.ae - 2018/03/13

assoctypeにtypealiasじゃなくてstruct定義でもいいんですね。

言われてみりゃそりゃそうだって感じですけど使ったことなかった。


tarunon - 2018/03/13

いや、これは暗黙的に推論されてると思う


t.ae - 2018/03/13

メソッドのほうからかな?


tarunon - 2018/03/13

そう


t.ae - 2018/03/13

試そうとしたんですが最近playgroundsが開かない

protocol Init {
    init()
}

protocol Proto {
    associatedtype JSON: Init
}

extension Proto {
    func hoge() -> JSON {
        return JSON()
    }
}

struct Hoge: Proto {
    struct JSON {
        
    }
}

こう書いたらtypealias書けって言われますね

あ、Hoge.JSONがInit適合してないからだ


tarunon - 2018/03/13

してないかな


t.ae - 2018/03/13

: Initつけたら怒られないですね


tarunon - 2018/03/13

お、そこはそうだ


t.ae - 2018/03/13

protocol Init {
    init()
}

protocol Proto {
    associatedtype JSON: Init
}

extension Proto {
    func hoge() -> JSON {
        return JSON()
    }
}

struct Hoge: Proto {
    struct JSON: Init, CustomStringConvertible {
        var description: String = "Hoge.JSON"
    }
}

print(Hoge().hoge()) // Hoge.JSON

こうかな

hoge()が挿入されて推論されるのかJSONが先にあるのか分からない


tarunon - 2018/03/13

protocol Foo {
    associatedtype Bar
}

struct Piyo: Foo {
    struct Bar {
        
    }
}

ありゃ、これ通るから

動きますね、すごい。昔はこれができなかったような気がします


omochimetaru - 2018/03/13

ん?


t.ae - 2018/03/13

それだけだとassoctypeのBarとPiyo.Barが同一視されてるか微妙だなぁと思ったんですが


omochimetaru - 2018/03/13

え、結局、名前でマッチしてた?


tarunon - 2018/03/13

そうっぽい


tarunon - 2018/03/13

@t.ae 同一視出来ていないとコンパイルが通らないのでこれはOKなきがします


t.ae - 2018/03/13

あーない場合はtypealias無いって言われますねそういえば

そんな基本的なことを忘れて長いコードを書いてしまった


omochimetaru - 2018/03/13

本題どっか行った


t.ae - 2018/03/13

encodeToInnerJSONの部分隠蔽できないんですかね


omochimetaru - 2018/03/13

隠蔽とは?


t.ae - 2018/03/13

UserCredentialをそのままJSONEncoderとかにわたせるように


omochimetaru - 2018/03/13

なってるよ

Codableだから


t.ae - 2018/03/13

あれ?

ああ一番上から来てるのか


omochimetaru - 2018/03/13

そうか、エンコード・デコードのサンプルも書かないとだめだった。