7

MVVM でバインドするために RxSwift を使用しようとしています。私は持っていEnumます:

enum Color : Int {
    case Red = 0, Green
}

およびテスト用のクラス

class Test : NSObject {
    var color: Color = .Red
    dynamic var test: String? {
        didSet {
            print("didSet \(test)")
        }
    }
}

そして、次のような変化を観察したい:

test.rx_observe(Color.self, "color").subscribeNext { (color) -> Void in
     print("Observer \(color)")
}.addDisposableTo(bag)

しかし、プログラムは *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<RDProject.Test 0x7ff373513020> addObserver:<RxCocoa.KVOObserver 0x7ff37351a420> forKeyPath:@"color" options:5 context:0x0] was sent to an object that is not KVC-compliant for the "color" property.'

単純String作業のコード:

test.rx_observe(String.self, "test").subscribeNext { string in
     print("Observer \(string)")
}.addDisposableTo(bag)

test.test = "1"
test.test = "2"

ここで、クラスを継承しないNSObjectようにするには、それを作成する必要があることを発見しましたが、動的dynamicにすることはできません。観測可能Enumにする方法はありますか?Enum

4

3 に答える 3

2

あなたの列挙型はタイプIntであるため、それを でマークすることにより、objective-c 互換にすることができます@objc。これを行うと、コンパイラはプロパティを としてマークしても問題ありませんdynamic。プロパティを KVO に準拠させるには、アノテーションも付ける必要があります@objc

@objc enum Color : Int {
    case Red = 0, Green
}

class Test : NSObject {
    @objc dynamic var color: Color = .Red
    dynamic var test: String? {
        didSet {
            print("didSet \(test)")
        }
    }
}
于 2016-03-16T10:01:57.777 に答える
0

プロキシ変数を作成し、それに KVO を使用することのみをお勧めします。

class Model: NSObject {

    enum Color: Int {
        case Red = 0, Green
    }

    dynamic var colorRaw: Int?
    var color: Color = .Red {
        didSet {
            colorRaw = color.rawValue
        }
    }

}

詳細はこちら - https://christianietze.de/posts/2015/05/observing-enum-swift-kvo/

于 2016-03-16T09:42:42.280 に答える