Objective c 对于swift类,使用class_addin方法捕获选择器

Objective c 对于swift类,使用class_addin方法捕获选择器,objective-c,swift,Objective C,Swift,我有ObjC课程: @interface SomeClass : NSObject @property(nonatomic, retain) NSNumber *sample; @end 及 和它的孩子: @objcMembers class SomeClass1: SomeClass { dynamic var temp = NSNumber(1) override init() { let setterHasMethod = SomeClass1.re

我有ObjC课程:

@interface SomeClass : NSObject

@property(nonatomic, retain) NSNumber *sample;

@end

和它的孩子:

@objcMembers
class SomeClass1: SomeClass {
    dynamic var temp = NSNumber(1)

    override init() {
        let setterHasMethod = SomeClass1.resolveInstanceMethod(#selector(setter: SomeClass1.temp))
        let getterHasMethod = SomeClass1.resolveInstanceMethod(#selector(getter: SomeClass1.temp))
        print("setterHasMethod: \(setterHasMethod)")
        print("getterHasMethod: \(getterHasMethod)")
    }
}
所以,当我执行这个

func doSome1() {
        let someInstance = SomeClass1()
        someInstance.temp = NSNumber(2)
        let res = someInstance.temp
        print("res: \(res)")
    }
不调用propertyIMP和setPropertyIMP

但是对于
示例

func doSome() {
        let someInstance = SomeClass1()
        someInstance.sample = NSNumber(2)
        let res = someInstance.sample
        print("res: \(res)")
    }
一切正常


可以为Swift属性调用
class\u addMethod
中使用的方法吗?

您必须使用
@NSManaged
而不是
dynamic

@objcMembers
class SomeClass1: SomeClass {
    @NSManaged var temp = NSNumber(1)

    override init() {
        let setterHasMethod = SomeClass1.resolveInstanceMethod(#selector(setter: SomeClass1.temp))
        let getterHasMethod = SomeClass1.resolveInstanceMethod(#selector(getter: SomeClass1.temp))
        print("setterHasMethod: \(setterHasMethod)")
        print("getterHasMethod: \(getterHasMethod)")
    }
}

不,这是
Objective-C
的唯一运行时功能,您可以尝试为属性添加
@objc
属性。@Cy-4AH您有任何证据吗?证据是您的代码不起作用?@Cy-4AH我找到了一个解决方案为什么不直接实现
didSet
?@Cy-4AH,因为我使用了库
@objcMembers
class SomeClass1: SomeClass {
    @NSManaged var temp = NSNumber(1)

    override init() {
        let setterHasMethod = SomeClass1.resolveInstanceMethod(#selector(setter: SomeClass1.temp))
        let getterHasMethod = SomeClass1.resolveInstanceMethod(#selector(getter: SomeClass1.temp))
        print("setterHasMethod: \(setterHasMethod)")
        print("getterHasMethod: \(getterHasMethod)")
    }
}