yujiro's blog

エンジニアリング全般の事書きます

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

簡単です。