2017-08-22 97 views
2

我想在运行时弄清楚某个类的属性是否可为空。例如:在运行时检查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

+3

'nullable'修饰符只是编译器的信息,可以帮助它向Swift提供适当的接口;它不修改编译的代码。 – Paulw11

+0

据我所知,您不能使用'class'(+)函数获取声明的变量值。检查你的代码是否有错误 – user3589771

+0

预编译脚本来抓取属性信息并插入方法decl? libclang很容易使用,尽管我不知道它是否公开了这个属性。 –

回答

5

每个Objective-C指针或对象属性在运行时在技术上都是可空的。可空性说明符只是编译器提示,不会影响实际构建的二进制文件[编辑:我的意思是,由于这显然不清楚,可以用Mach-O或其他一些可比较的二进制文件写入磁盘的1和0格式由编译器和链接器组成,其中包含代表程序逻辑的机器指令以及其他信息和元数据]。因此,在运行时没有办法检测哪些属性可以为空而哪些不可以。

+0

+1除*因此*以外完全正确。有时,您可以在运行时获取类型信息,这对于运行时环境的工作本身并不重要。 –

+0

@Amin Negm-Awad不可空性。该信息在运行时不存在。 –

+0

我知道。但是你说,这是不可用的,*因为*(因此)它仅仅是一个编译器提示。但这不是一个有效的论点。 –

相关问题