是否有一种方法可以返回符合 NSKeyValueCoding 协议的对象的所有键?
类似的东西[object getPropertyKeys]
会返回一个 NSString 对象的 NSArray。它适用于任何符合 KVC 的对象。这样的方法存在吗?到目前为止,我在搜索 Apple 文档时还没有找到任何东西。
谢谢,G。
是否有一种方法可以返回符合 NSKeyValueCoding 协议的对象的所有键?
类似的东西[object getPropertyKeys]
会返回一个 NSString 对象的 NSArray。它适用于任何符合 KVC 的对象。这样的方法存在吗?到目前为止,我在搜索 Apple 文档时还没有找到任何东西。
谢谢,G。
#import "objc/runtime.h"
unsigned int outCount, i;
objc_property_t *properties = class_copyPropertyList([self class], &outCount);
for(i = 0; i < outCount; i++) {
objc_property_t property = properties[i];
const char *propName = property_getName(property);
if(propName) {
const char *propType = getPropertyType(property);
NSString *propertyName = [NSString stringWithUTF8String:propName];
NSString *propertyType = [NSString stringWithUTF8String:propType];
}
}
free(properties);
使用class_getPropertyList。这将告诉你所有@properties
的对象。
它不一定会列出所有符合 KVC 的属性,因为任何不带参数并返回值的方法都是有效的符合 KVC 的 getter。运行时没有 100% 可靠的方法可以知道哪些行为表现为属性(例如,-[NSString length]
),哪些行为表现为命令(例如,-[NSFileHandle readDataToEndOfFile]
)。
无论如何,您都应该声明符合 KVC 的属性@properties
,所以这应该不是太大的问题。
没有这样的方法,因为 KVO 系统不需要对象/类向其注册它们支持 KVO 的属性。任何密钥都可能支持 KVO,唯一知道的方法是从作者的文档中。
当然,也不能保证 an@property
会支持 KVO。很可能编写一个不需要的属性(有时可能是必要的)。因此,在我看来,获取一个类的列表@property
然后假设它们符合 KVO 标准将是一个危险的选择。
您需要一个 getPropertyType 函数。请参阅这篇文章:在 Objective-C 中获取对象属性列表
对于 Swift 围观者,您可以通过使用该功能来获得此Encodable
功能。我将解释如何:
使您的对象符合Encodable
协议
class ExampleObj: NSObject, Encodable {
var prop1: String = ""
var prop2: String = ""
}
创建扩展Encodable
以提供toDictionary
功能
public func toDictionary() -> [String: AnyObject]? {
let encoder = JSONEncoder()
encoder.outputFormatting = .prettyPrinted
guard let data = try? encoder.encode(self),
let json = try? JSONSerialization.jsonObject(with: data, options: .init(rawValue: 0)), let jsonDict = json as? [String: AnyObject] else {
return nil
}
return jsonDict
}
调用toDictionary
您的对象实例并访问keys
属性。
let exampleObj = ExampleObj()
exampleObj.toDictionary()?.keys
瞧!像这样访问您的属性:
for k in exampleObj!.keys {
print(k)
}
// Prints "prop1"
// Prints "prop2"