Vla*_*mir 9 cocoa encapsulation objective-c declared-property
我想保护对公共接口中NSMutableArray的访问
我试图通过在公共接口中将属性定义为NSArray并在私有接口中将NSMutableArray定义为:
@interface Order : NSObject
@property (readonly, strong, nonatomic) NSArray* comments;
@end
@interface Order()
@property (readwrite, strong, nonatomic) NSMutableArray* comments;
@end
Run Code Online (Sandbox Code Playgroud)
但这不起作用 - 所以我必须在公共接口NSMutableArray中定义属性:
@interface Order
@property (strong, nonatomic) NSMutableArray* comments;
@end
Run Code Online (Sandbox Code Playgroud)
目标是为API客户端提供对注释的只读访问权限,以及addObject:对实现中的方法的完全访问权限.
所以定义目标更清晰:
所以简单的问题是,是否可以使属性的公共定义更通用(NSArray而不是NSMutableArray).
有没有其他干净的方法来达到目标或我必须在任何地方使用NSMutableArray?
解析度
在回顾了我原来的问题和答案之后,我意识到我想在公共接口中使用更多泛型类NSArray,在实现中使用NSMutableArray - 但这对于一个属性来说是不可能的.所以答案是不可能的.
因此,我将使用NSMutableArray的单一属性,而不需要任何额外的保护.
但是如果你真的更喜欢保护而不是简单和高效,我也会选择最合适的答案.
Jos*_*ell 13
如果您只想让客户端读取数组,则不需要公共属性.
只需创建一个访问器方法,该方法返回私有可变数组的副本:
@interface Order : NSObject
- (NSArray *)allComments;
@end
@implementation Order ()
@property (nonatomic, strong) NSMutableArray * comments;
@end
@implementation Order
@synthesize comments;
- (NSArray *)allComments
{
return [[self comments] copy];
}
@end
Run Code Online (Sandbox Code Playgroud)
这种模式可以在例如NSView:中看到,constraints并且subviews在内部是可变的,但只能通过返回不可变数组的单个方法进行读取.
| 归档时间: |
|
| 查看次数: |
2774 次 |
| 最近记录: |