Swift でprivate なプロパティを書き換える
小ネタです。
ユニットテストを書いているとき、テスト対象のprivate なインスタンス変数を書き換えたいと思うことがあります。
標準のリフレクションだと結構面倒くさいことになります。
詳しくは、https://stackoverflow.com/questions/31589405/using-reflection-to-set-object-properties-without-using-setvalue-forkey をご参照ください。
上記のStackoverflow でも紹介されていますが、Runtime というライブラリを使うと簡単になるみたいです。
class Hoge { private var flag: Bool = false func printFlag() { print(flag) } } func testHoge() { var h = Hoge() let info = try! typeInfo(of: Hoge.self) let property = try! info.property(named: "flag") try! property.set(value: true, on: &h) h.printFlag() }
=> true
簡単です。