Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What is the Objective-C equivalent of a public get/protected set property in C#

Is there any way to create a property like this C# property in Objective-C?

public int prop { get; protected set;}

Essentially, I want to make it possible to get the value from outside the class, but to only be able to set the value from within the class.

like image 901
Jason Baker Avatar asked Aug 27 '09 01:08

Jason Baker


3 Answers

The easiest way to accomplish this is to declare the property as readonly in the public interface for MyClass (i.e. the .h file):

@property (readonly) NSInteger prop;

Then, in .m file for that class, declare a class extension (a category with an empty name). In class extensions, you may redeclare a @property to change its writeability to readwrite:

@interface MyClass ()
@property (readwrite) NSInteger prop;
@end

@implementation MyClass
@synthesize prop;
...
@end

Of course, Objective-C does not enforce access restrictions, so there's nothing stopping some rogue code from calling -[MyClass setProp:]. The compiler will flag this as a warning, however, which is as good as you can get in Objective-C. Unfortunately, there is no standard way to document this "protected" writeable property to subclasses; you'll have to settle on a convention for your team and or put it in the public documentation for the class if it's in a framework that you're going to release.

like image 102
Barry Wark Avatar answered Sep 28 '22 06:09

Barry Wark


I believe you are looking for the readonly attribute on the @property

@property (readonly) NSInteger prop;

Read more here.

like image 21
keno Avatar answered Sep 28 '22 08:09

keno


There's no way to make methods @private/@protected in ObjC, these compiler directoves apply only on instance variables. You can, however, declare a static C function in the same file to get a "@private" method.

keno's answer seems like most correct way of achieving this.

like image 20
arul Avatar answered Sep 28 '22 08:09

arul