Ios 带有动态变量的swift类的计时问题,该类继承自objective c,其中替换了get/set方法
我有一个非常具体的问题,如果我有一个从objective-c类继承的swift类,它有一个动态属性 现在,在+initialize上,我正在将getter和setter注入swift(:NSObject)类中,除了从init重载设置值时的一个小问题之外,这些工作没有问题 所以,我的swift课程是这样的:Ios 带有动态变量的swift类的计时问题,该类继承自objective c,其中替换了get/set方法,ios,objective-c,swift,method-swizzling,Ios,Objective C,Swift,Method Swizzling,我有一个非常具体的问题,如果我有一个从objective-c类继承的swift类,它有一个动态属性 现在,在+initialize上,我正在将getter和setter注入swift(:NSObject)类中,除了从init重载设置值时的一个小问题之外,这些工作没有问题 所以,我的swift课程是这样的: class TestClass: BaseClass { dynamic var testStringProperty: String? init(initialValue
class TestClass: BaseClass {
dynamic var testStringProperty: String?
init(initialValue: String) {
super.init()
self.testStringProperty = initialValue;
// does not trigger the get/set methods
// a po self.testStringProperty will output 'nil'
let xyz = self.testStringProperty;
// xyz is actually set to the value of initialValue, but it does not trigger the getter.
}
}
作为swift基础的objective-c等级如下:
static id storedVar;
@implementation BaseClass
+ (void)initialize {
// we are going to exchange getter/setter methods for a property on a SwiftClass, crude but demonstrates the point
if(![[self description] isEqualToString:@"BaseClass"]) {
IMP reader = (IMP)getPropertyIMP;
IMP writer = (IMP)setPropertyIMP;
const char* type = "@";
NSString* propertyName = @"testStringProperty";
IMP oldMethod = class_replaceMethod([self class], NSSelectorFromString(propertyName), reader, [[NSString stringWithFormat:@"%s@:", type] UTF8String]);
NSString* setMethod = [NSString stringWithFormat:@"set%@%@:", [[propertyName substringToIndex:1] uppercaseString], [propertyName substringFromIndex:1]];
oldMethod = class_replaceMethod([self class], NSSelectorFromString(setMethod), writer, [[NSString stringWithFormat:@"v@:%s",type] UTF8String]);
}
}
static id getPropertyIMP(id self, SEL _cmd) {
return storedVar;
}
static void setPropertyIMP(id self, SEL _cmd, id aValue) {
storedVar = aValue;
}
@end
长话短说,在调用init(initialValue:String)
时,不会触发getter和setter,但在调用init完成后,它们会立即工作
尽管调用初始化已成功完成,并且方法已被替换,但仍会出现这种情况
但是在init
函数之外,get/set的行为与预期的一样
这就是它的名字
let test = TestClass(initialValue: "hello");
test.testStringProperty = "hello"
创建对象后,po test.testStringProperty
将输出nil。但随后的赋值会触发所有正确的方法
仅当在init内赋值时失败。在其他任何地方,它都像一种魅力
如果可能的话,我想让它在初始化器中工作,我不确定是否有其他方法可以解决它
以下是复制该问题的示例应用程序的链接: