[英]Objective C Semi Readonly property
我想在我的class
聲明一個public NSString property
, class
在我的class
外部充當readonly property
但是我可以在我的類中assign
任何值。 我該如何實現這種行為。
您必須像這樣在.h
文件中聲明屬性
@interface MyClass : NSObject
@property (strong, nonatomic, readonly) NSString *aString;
@end
但是在您的.m
文件中,您必須
@interface MyClass () // your anonymous category
@property (strong, nonatomic, readwrite) NSString *aString;
@end
@implementation MyClass
@end
在外部aString
是readonly
,在內部您可以設置值(readwrite)
。
通過實現anonymous category also known as class extension in Objective-C
來實現此anonymous category also known as class extension in Objective-C
在標頭中將屬性定義為readonly
,並在class extension
的實現文件中將其聲明為readWrite
。 該屬性將在類實現之外為只讀,而在實現中為可讀寫。
// Interface file:
@interface Test : NSObject
@property (nonatomic, copy, readonly) NSString *propertyString;
@end
// Implementation file:
@interface Test () // Class Extension
@property (nonatomic, copy, readwrite) NSString *propertyString;
@end
@implementation Test
@end
請參閱: 使用類擴展來隱藏私人信息
正如@Amin Negm-Awad在回答中指出的那樣:接口和類擴展不必在接口或實現文件中,盡管這是通常的用法。
在.h
文件中添加:
@property(nonatomic,readonly)NSString* property;
在.m
文件中添加:
@interface yourClass ()
@property(nonatomic,readwrite)NSString* property;
@end
在頭文件(接口)中將屬性定義為只讀,在實現文件中將屬性定義為可讀寫。 這也使您可以輕松地使其變弱/變強/復制。
這可能是顯而易見的:
在您的.h文件中,聲明屬性為readonly
@property (nonatomic, assign, readonly, getter = isLoading) BOOL loading;
在您的.m文件中,將屬性聲明為readwrite
@property (nonatomic, assign, readwrite, getter = isLoading) BOOL loading;
這是一個示例,顯然您應該創建強大的NSString
屬性,並且我假設編譯器不允許在類外設置其他值,但可以在類內設置其他值。
在標頭中將屬性定義為readonly
,然后使用下划線語法進行設置。
@property (nonatomic, readonly) NSString *myString;
- (void)someMethodInYourDotMFile {
_myString = YES;
}
除了現有的答案,這些答案告訴您定義一個readonly屬性並將其更改為readwrite屬性,這是完全正確的和預期的模式(即readwrite的用途),我想添加一個可能重要的信息:
您將只讀定義放在接口中。 (不是標題!)
您將讀寫定義放在類的延續中。 (不是實現文件)
可能會說這是相同的,因為接口位於標頭中,而類延續則位於實現文件中。 但這只是通常情況。
您還可以將類的延續放在第三個文件中。 然后,諸如“朋友班”之類的東西可以另外導入它,並且該“油炸班”具有寫訪問權。 在開發框架時,我經常這樣做。
MyClass.h://公共頭文件,每個人都可以使用
@interface MyClass : NSObject
@property (readonly, …) id property1; // Everyone can read it
@property (readonly, …) id property2; // Everyone can read it
- (void)method; // Everyone can use it
@end
MyClass_Package.h://項目標頭,可用於框架類,不適用於框架的用戶
@interface MyClass()
@property (readwrite, …) id property1; // All classes inside the framework can write it
- (void)packageMethod; // All classes inside the framework can use it
@end
MyClass.m
@interface MyClass() // A second class extension inside .m
@property (readwrite, …) id property2; // Only MyClass can write it
- (void)privateMethod; // Only MyClass can use it
@end
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.