簡體   English   中英

Objective C半只讀屬性

[英]Objective C Semi Readonly property

我想在我的class聲明一個public NSString propertyclass在我的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

在外部aStringreadonly ,在內部您可以設置值(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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM