objective-c - 如何声明由可变类型支持的不可变属性?

标签 objective-c properties

我想声明一个公共(public)的不可变属性:

@interface Foo
@property(strong, readonly) NSSet *items;
@end

…在实现文件中支持可变类型:

@interface Foo (/* private interface*/)
@property(strong) NSMutableSet *items;
@end

@implementation
@synthesize items;
@end

我想要的是实现中的可变集合,当从外部访问时该集合被强制转换为不可变集合。 (我不在乎调用者可以将实例转换回 NSMutableSet 并破坏封装。我住在一个安静、体面的小镇,那里不会发生这种事情。)

现在,我的编译器在实现中将该属性视为 NSSet。我知道有很多方法可以让它工作,例如使用自定义 getter,但是有没有一种方法可以简单地使用声明的属性来完成它?

最佳答案

最简单的解决方案是

@interface Foo {
@private
    NSMutableSet* _items;
}

@property (readonly) NSSet* items;

然后就

@synthesize items = _items;

在你的实现文件中。然后您可以通过 _items 访问可变集,但公共(public)接口(interface)将是一个不可变集。

关于objective-c - 如何声明由可变类型支持的不可变属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7710400/

相关文章:

ios - 具有不同分段级别的 UISlider

ios - 我如何通过带有非字母字符的名字过滤 NSMutableArray

c# - 在不接触类的情况下添加属性? (不是继承)

java - 使用@Value 注解时,Spring 究竟是如何注入(inject)属性的?

java - Spring中是否正确地通过变量在属性中引用另一个bean?

java - 如何更改 application.properties 中的属性?

objective-c - 以编程方式更改 OSX 中的用户帐户图像

ios - 如何将 indexPath 从页脚内的按钮传递到 segue?

objective-c - UITableView Header View 下拉时展开弹跳区域

c++ - 模块属性名称-值对 C++ API 框架 - reshape ?