2017-08-22 96 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

我知道。但是你說,這是不可用的,*因爲*(因此)它僅僅是一個編譯器提示。但這不是一個有效的論點。 –

相關問題