Objective c 对于swift类,使用class_addin方法捕获选择器
我有ObjC课程: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
@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)")
}
}