Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Objective-C与C中的公共get/protected set属性的等价物是什么#_C#_Objective C_Properties - Fatal编程技术网

C# Objective-C与C中的公共get/protected set属性的等价物是什么#

C# Objective-C与C中的公共get/protected set属性的等价物是什么#,c#,objective-c,properties,C#,Objective C,Properties,有没有办法在Objective-C中创建这样的C#属性 public int prop { get; protected set;} 本质上,我希望能够从类外部获取值,但只能从类内部设置值。我相信您正在查找@property上的readonly属性 @property (readonly) NSInteger prop; 阅读更多 无法使方法@private/@在ObjC中受到保护,这些编译器指令仅适用于实例变量。但是,您可以在同一个文件中声明一个静态C函数以获得“@private”方法 基

有没有办法在Objective-C中创建这样的C#属性

public int prop { get; protected set;}

本质上,我希望能够从类外部获取值,但只能从类内部设置值。

我相信您正在查找@property上的readonly属性

@property (readonly) NSInteger prop;

阅读更多

无法使方法@private/@在ObjC中受到保护,这些编译器指令仅适用于实例变量。但是,您可以在同一个文件中声明一个静态C函数以获得“@private”方法


基诺的回答似乎是实现这一点的最正确的方法。

实现这一点的最简单方法是在
MyClass
的公共界面(即.h文件)中将属性声明为
只读

然后,在该类的.m文件中声明一个类(名称为空的类别)。在类扩展中,您可以使用@property将其可写性更改为readwrite:

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

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

当然,Objective-C不强制执行访问限制,因此没有任何东西可以阻止某些恶意代码调用
-[MyClass setProp:://code>。然而,编译器会将此标记为警告,这在Objective-C中是最好的。不幸的是,没有标准方法将此“受保护”可写属性记录到子类中;您必须为您的团队确定一个约定,或者将其放入类的公共文档中(如果它位于您将要发布的框架中)。

但这不要求我直接访问它背后的值而不是使用属性吗?是的,如果只想在类中设置值,那么实际上不需要使用self.prop语法。。。你可以直接引用道具。readonly属性保证类外的任何内容只能获取值,但不能设置它。这是一个不完整的答案;您可以在类扩展中重新声明属性以使其可读写。实际上受保护具有特殊含义,它还意味着派生类将具有访问权限。受保护或私有将适用于我。:-)
readwrite
不是默认值吗?有必要指定吗?@RaffiKhatchadourian,
readwrite
是默认值,但是在重写
readonly
原始声明的类扩展中,
readwrite
是必需的。@BarryWark-你错了。试试看。由于默认值为
readwrite
,因此重新声明属性会在默认情况下将其重新声明为
readwrite
。这就是默认值的含义。:)不过,如果你在凌驾于其他事情之上,那么稍微明确一点也没有坏处。
@interface MyClass ()
@property (readwrite) NSInteger prop;
@end

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