我正在尝试在swift中复制此功能:https://stackoverflow.com/a/11774276/4102858。我能够在Swift中成功重新创建allPropertyNames()。但是,我在使用方法pointerOfIvarForPropertyNamed()时遇到了同样的问题。主要原因是Objc解决方案使用函数object_getInstanceVariable(),它在Swift中不可用。
TLDL:我试图在Swift中重新创建此方法:
- (void *)pointerOfIvarForPropertyNamed:(NSString *)name
{
objc_property_t property = class_getProperty([self class], [name UTF8String]);
const char *attr = property_getAttributes(property);
const char *ivarName = strchr(attr, 'V') + 1;
Ivar ivar = object_getInstanceVariable(self, ivarName, NULL);
return (char *)self + ivar_getOffset(ivar);
}
这就是我现在所处的位置:
func pointerOfIvarForPropertyNamed(name: String) -> AnyObject {
func unicodeValueOfString(string: String) -> UInt32 {
for s in String(string).unicodeScalars {
return s.value
}
return 0
}
var property: COpaquePointer = class_getProperty(self.classForCoder, (name as NSString).UTF8String)
var attr: UnsafePointer<Int8> = property_getAttributes(property)
var ivarName: UnsafeMutablePointer<Int8> = strchr(attributesPointer, Int32(unicodeValueOfString("V"))) + 1
//object_getInstanceVariable() not available in Swift
}
问题:
函数object_getInstanceVariable()在Swift
中不可用我一般缺乏使用Objective-C运行时的经验
答案 0 :(得分:0)
来自Swift文档(强调我的):
如果您有使用Objective-C的经验,您可能知道它提供了两种方法来存储值和引用作为类实例的一部分。除了属性之外,您还可以使用实例变量作为存储在属性中的值的后备存储。
Swift将这些概念统一到一个属性声明中。 Swift属性没有相应的实例变量,并且不会直接访问属性的后备存储。这种方法避免了在不同上下文中如何访问值的混淆,并将属性的声明简化为单一,明确的陈述。有关该属性的所有信息(包括其名称,类型和内存管理特征)都在一个位置定义为类型定义的一部分。
根据pointerOfIvarForPropertyNamed
的使用方式,您可能无法将该方法直接转换为Swift,因为它没有Ivars。您可以use Key-Value Coding来实现您想要的目标。
如果你想扩展这个方法的使用方法,我可以适当地扩展我的答案。