Swift 4 で class のプロパティ一覧を取得する

Objective-C 時代には class_copyPropertyList でできたようです。これをキーワードにググるといくつか記事が出てくると思われます。

Swift 4 で同様のことを行う場合は Mirror とやらを使うようです。

import UIKit

protocol PropertyNames {
    func propertyNames() -> [String]
}
extension PropertyNames {
    func propertyNames() -> [String] {
        return Mirror(reflecting: self).children.compactMap{ $0.label }
    }
}

class Author : PropertyNames {
    var name: String
    var category: Int
    init() {
        self.name = ""
        self.category = 0
    }
}

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        var author = Author()
        print("\(author.propertyNames())")
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}


出力結果は
[“name”, “category”]

参照:
List of class’s properties in swift
Swift reflectionについて
[Swift]flatMap・compactMapの挙動はソースコードを読んで理解しよう〜型情報と実装から難関メソッドを突破する〜

フォローする