Swift codableなclass(object)のプロパティに変数で動的にアクセスする
あまり応用シーンはなさそうだけど今回やりたかったことは
user["id"]、user["name"]みたいなかんじでプロパティにアクセスしたかった。
やりたかった理由はObjectから特定のプロパティを表示する画面を作りたかった。
こんなクラスがあってプロパティがたくさんあるイメージ
class User { var id: Int var name: String ・・・ }
テーブルビューに表示するのだが、各行で if や switch でハードコードするのも何となく無駄な気がして別の方法を検索。
たまたま、今回はAPIから取得した値をCodableなClassとして扱っていてStackOverflowにいい方法がのってた。
・StackOverflow
https://stackoverflow.com/questions/45209743/how-can-i-use-swift-s-codable-to-encode-into-a-dictionary
こんな感じのextensionを作る
extension Encodable { subscript(key: String) -> Any? { return dictionary[key] } var dictionary: [String: Any] { return (try? JSONSerialization.jsonObject(with: JSONEncoder().encode(self))) as? [String: Any] ?? [:] } }
利用方法
// Object var user = User(id: 1, name: "user1", ・・・) // 表示する順番を定義 var fields = [ "id", "name", ・・・ ] // テーブル表示 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { // user[fields[indexPath.row]] でプロパティにアクセスできる }
プロパティの値を更新したい場合はこれだと上手くいかないけど今回は表示するだけの目的だったので事足りた。以上です。