在运行时检查ObjC属性是否可为空
我想在运行时弄清楚某个类的属性是否可为空。例如:在运行时检查ObjC属性是否可为空
@interface A : NSObject
+ (NSSet<NSString *> *)nullableProperties;
@property (readonly, nonatomic) NSString *description;
@property (readonly, nonatomic, nullable) NSError *error;
@end
@implementation A
+ (NSSet<NSString *> *)nullableProperties {
// Code that identifies nullable properties.
}
@end
nullableProperties
应该在这种情况下,与@"error"
返回NSSet
。
property_getAttributes
功能可以提供一些属性的信息(更多信息here)。不幸的是,它没有提供有关该财产是否被宣布为可空的信息。
我想避免对每个需要知道可为null属性的类实现nullableProperties
。
每个Objective-C指针或对象属性在运行时在技术上都是可空的。可空性说明符只是编译器提示,不会影响实际构建的二进制文件[编辑:我的意思是,由于这显然不清楚,可以用Mach-O或其他一些可比较的二进制文件写入磁盘的1和0格式由编译器和链接器组成,其中包含代表程序逻辑的机器指令以及其他信息和元数据]。因此,在运行时没有办法检测哪些属性可以为空而哪些不可以。
+1除*因此*以外完全正确。有时,您可以在运行时获取类型信息,这对于运行时环境的工作本身并不重要。 –
@Amin Negm-Awad不可空性。该信息在运行时不存在。 –
我知道。但是你说,这是不可用的,*因为*(因此)它仅仅是一个编译器提示。但这不是一个有效的论点。 –
'nullable'修饰符只是编译器的信息,可以帮助它向Swift提供适当的接口;它不修改编译的代码。 – Paulw11
据我所知,您不能使用'class'(+)函数获取声明的变量值。检查你的代码是否有错误 – user3589771
预编译脚本来抓取属性信息并插入方法decl? libclang很容易使用,尽管我不知道它是否公开了这个属性。 –