Ios 带有动态变量的swift类的计时问题,该类继承自objective c,其中替换了get/set方法

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

我有一个非常具体的问题,如果我有一个从objective-c类继承的swift类,它有一个动态属性

现在,在+initialize上,我正在将getter和setter注入swift(:NSObject)类中,除了从init重载设置值时的一个小问题之外,这些工作没有问题

所以,我的swift课程是这样的:

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内赋值时失败。在其他任何地方,它都像一种魅力

如果可能的话,我想让它在初始化器中工作,我不确定是否有其他方法可以解决它

以下是复制该问题的示例应用程序的链接: