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