我被objective-c屬性卡住了。我需要的是爲變量指定一個只寫屬性,與readonly完全相反,即變量可以有setMethod
,但它不應該有getMethod
。我不知道該怎麼做。一些代碼片段的答案表示讚賞。在Objective-C中只寫屬性
26
A
回答
11
你可以這樣做:
@interface MyClass {
@private
int _var;
}
- (void)setVar:(int)newVar;
@end
@implementation MyClass
- (void)setVar:(int)newVar {
_var = newVar;
}
@end
現在你可以訪問變量var
一樣,是隻寫一個屬性:
@implementation SomeOtherClass
...
MyClass c = [[MyClass alloc] init];
c.var = 3;
...
@end
如果你嘗試讀取假屬性編譯器會警告你。
5
這是否有任何理由需要屬性?我只是聲明setter作爲一種方法,並使用正常的[foo setVar:bar]
語法。
+5
或者使用點語法...`foo.var = bar;`仍然可以工作。 – bbum 2010-11-24 19:37:27
44
另一種有效的方法是申報普通財產,使吸氣不可用
@interface MyClass
@property NSString * var;
- (NSString *)var UNAVAILABLE_ATTRIBUTE;
@end
這將提高的情況下,有人試圖訪問的吸氣劑編譯時錯誤。
這種方法的主要優點是,你實際上有一個不動產TM,而不是由一個實例變量和一個setter僞造的替代品,這意味着:
- 你在Xcode中使用點符號時會自動完成
- 所有運行時功能,如
class_getProperty
和class_copyPropertyList
將按預期工作。
這就是說,吸氣實現反正合成,它可以使用類似
NSString * string = [myObj performSelector:@selector(var)];
或使用NSInvocation
調用(在非id
財產的情況下)
如果你是偏執和你真的想要阻止客戶端調用getter,你可以通過提供你自己的實現明確地拋出一個異常。
@implementation MyClass
- (int)var {
[NSException raise:NSInternalInconsistencyException
format:@"property is write-only"];
}
@end
無論如何,如果有人想認真與你的實例變量篡改,他們可以使用運行時訪問它,所以給出的使用情況下,最後的預防措施很可能是無用的。編譯時錯誤是你真正想要的。
相關問題
- 1. Yii2只寫屬性
- 2. 屬性「CommandArgument」是隻寫
- 3. 重寫抽象只讀屬性以讀取/寫入屬性
- 4. 當預期設置ObjectiveC類屬性時?
- 5. 在接口中只讀和只寫自動屬性
- 6. 在Python中重寫屬性
- 7. 在javamoney.properties中重寫屬性?
- 8. 在Elixir中編寫屬性
- 9. 寫入excel和只讀屬性vb.net
- 10. 的FxCop + MVP:「屬性不應該只寫」
- 11. Python:檢查只寫屬性的類
- 12. XML屬性「的innerText」是隻寫試圖讀取屬性值
- 13. 在Perl Moose類中寫入只讀屬性
- 14. 只從屬性獲取屬性只有一個屬性JQuery
- 15. 重寫屬性屬性
- 16. 重寫屬性屬性
- 17. 只讀屬性
- 18. 只讀屬性
- 19. PHP中的只讀屬性?
- 20. 只讀屬性,在C#6.0
- 21. 只讀屬性在MVC 4
- 22. 如何編寫僞只寫依賴項屬性?
- 23. 在PropertyGrid中動態設置屬性的只讀屬性
- 24. 更改屬性屬性就像只讀在設計時(PropertyGrid中)
- 25. SASS:只有屬性可以嵌套在屬性中。爲什麼?
- 26. NHibernate中的反向屬性和只讀屬性在做什麼?
- 27. 重寫屬性
- 28. 重寫屬性
- 29. 在派生類中使屬性只讀
- 30. 只顯示Rails中存在的屬性
什麼是隻寫屬性的用法?恕我直言,這只是對內存的浪費。 – Eimantas 2010-11-24 11:25:08
許多用途;通常當你想要某些東西是公開的只寫和內部到這個類時,它就是readwrite。 – bbum 2010-11-24 19:36:44
當外部類知道需要傳入的變量但沒有理由知道當前設置的變量時。 – ArtOfWarfare 2013-10-20 19:28:39