3

我有一个非常具体的问题,如果我有一个继承自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"

Apo test.testStringProperty 创建对象后,会输出 nil。但是随后的分配会触发所有正确的方法。

只有在 init 中分配时才会失败。在其他任何地方,它都像魅力一样工作。

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

这是复制问题的示例应用程序的链接:

https://www.dropbox.com/s/5jymj581yps799d/swiftTest.zip?dl=0

4

0 回答 0