我使用以下类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)
}
如何获取可选名称?
谢谢,
答案 0 :(得分:4)
Foundation
提供了从Bool
到NSNumber
的桥梁(以及Int
,String
的桥梁等),但它没有提供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与动态代码保持同步。