无法在Swift中使用class_copyPropertyList获取可选变量

时间:2014-08-21 08:11:00

标签: objective-c swift

我使用以下类Serializable将类Object转换为Json。见LINK

 var aClass : AnyClass? = self.dynamicType
    var propertiesCount : CUnsignedInt = 0
    let propertiesInAClass : UnsafePointer<objc_property_t> = class_copyPropertyList(aClass, &propertiesCount)
    var propertiesDictionary : NSMutableDictionary = NSMutableDictionary()

    for var i = 0; i < Int(propertiesCount); i++ {
        var property = propertiesInAClass[i]
        var propName = NSString(CString: property_getName(property), encoding: NSUTF8StringEncoding)
        var propType = property_getAttributes(property)
        var propValue : AnyObject! = self.valueForKey(propName);
   /* ... */ 
 }

它工作正常但是当类包含可选值时,class_copyPropertyList(aClass, &propertiesCount)看不到它。

考虑以下基本课程:

class Person : Serializable{
  var age = 1
  var name = "no name yet"
  var hasMail:Bool?

}

即使我会写:

var person = Person()
person.hasMail =  true

我只得到:

age
name 

要使其正常工作,我需要写var hasMail:Bool = false


对于游乐场(复制/粘贴)

class User : NSObject{
    var age = 1
    var name = "no name yet"
    var hasMail:Bool?

}

var person = User()
person.hasMail =  true

 var aClass : AnyClass? = person.dynamicType
var propertiesCount : CUnsignedInt = 0
let propertiesInAClass : UnsafeMutablePointer<objc_property_t> = class_copyPropertyList(aClass, &propertiesCount)

 println(propertiesInAClass)

for var i = 0; i < Int(propertiesCount); i++ {
    var property = propertiesInAClass[i]
    var propName = NSString(CString: property_getName(property), encoding: NSUTF8StringEncoding)
    println(propName)
}

如何获取可选名称?

谢谢,

2 个答案:

答案 0 :(得分:4)

Foundation提供了从BoolNSNumber的桥梁(以及IntString的桥梁等),但它没有提供Bool?的桥梁。这就是Objective-C不可见的原因。如果您尝试使用hasMail注释@objc,则会产生错误,而对其他属性则有效。

答案 1 :(得分:0)

在Swift 4 w / XC9.2中,我在Obj-C中看到了Swift选项。这是我使用的代码:

在Swift课程中:

    @objc var optionalNumber:NSNumber?

在Objective-C代码中:

Class              object         =   MyClass.class;
unsigned int       numProperties  =   0;
objc_property_t*   classProps     =   class_copyPropertyList(object, &numProperties);

for (NSInteger index = 0; index < numProperties; index++)
{
      objc_property_t     aProperty   =   classProps[index];
    //...
}

在我看到的时候:

  

(lldb)po属性

     

“T @ \” 的NSNumber \ “N,&安培;,VoptionalNumber”

当它试图将它的模型映射到可选的NSNumber时,我仍然遇到CoreData崩溃的问题,但我可能最终会在运行时将NSNumber映射到小数以解决问题(如果我使用非可选的在swift类中的NSNumber一切正常,所以它看起来像一个CoreData错误。)

作为参考,这是提供自动Class to CoreData实体模型的代码的一部分,而不必使xcdatamodeld与动态代码保持同步。