在Swift中按名称获取实例变量

时间:2015-02-13 04:41:24

标签: ios swift

我正在尝试在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运行时的经验

1 个答案:

答案 0 :(得分:0)

来自Swift文档(强调我的):

  

如果您有使用Objective-C的经验,您可能知道它提供了两种方法来存储值和引用作为类实例的一部分。除了属性之外,您还可以使用实例变量作为存储在属性中的值的后备存储。

     

Swift将这些概念统一到一个属性声明中。 Swift属性没有相应的实例变量,并且不会直接访问属性的后备存储。这种方法避免了在不同上下文中如何访问值的混淆,并将属性的声明简化为单一,明确的陈述。有关该属性的所有信息(包括其名称,类型和内存管理特征)都在一个位置定义为类型定义的一部分。

根据pointerOfIvarForPropertyNamed的使用方式,您可能无法将该方法直接转换为Swift,因为它没有Ivars。您可以use Key-Value Coding来实现您想要的目标。

如果你想扩展这个方法的使用方法,我可以适当地扩展我的答案。