gpt4 book ai didi

objective-c - 防止在公共(public)接口(interface)中将对象添加到 NSMutableArray

转载 作者:太空狗 更新时间:2023-10-30 03:27:55 25 4
gpt4 key购买 nike

我想在公共(public)接口(interface)中保护对 NSMutableArray 的访问

我试图通过在公共(public)接口(interface)中将属性定义为 NSArray 并在私有(private)接口(interface)中将属性定义为 NSMutableArray 来实现这一点,如下所示:

@interface Order : NSObject
@property (readonly, strong, nonatomic) NSArray* comments;
@end

@interface Order()
@property (readwrite, strong, nonatomic) NSMutableArray* comments;
@end

但这不起作用 - 所以我必须改为在公共(public)接口(interface) NSMutableArray 中定义属性:

@interface Order
@property (strong, nonatomic) NSMutableArray* comments;
@end

目标是为 API 客户端提供对注释的只读访问权限,并在实现中提供对 addObject: 等方法的完全访问权限。

所以定义目标更清晰:

  1. 客户端应该可以访问 NSArray 属性,但不能访问变异方法。
  2. 客户端不应该能够更新评论以指向新值。
  3. 解决方案必须在不创建额外结构和数组复制的情况下完成。

所以简单的问题是是否有可能使属性的公共(public)定义更通用(NSArray 而不是 NSMutableArray)。

是否有任何其他干净的方法可以达到目标,或者我必须在任何地方都使用 NSMutableArray?

决议

在查看我最初的问题和答案后,我意识到我想在公共(public)接口(interface)中使用更通用的类 NSArray 并在实现中使用 NSMutableArray - 但它不可能用于一个属性。所以答案是不可能的。

所以我将只使用 NSMutableArray 的单一属性,而不需要任何额外的保护。

但我也会选择最合适的答案,如果您真的更喜欢保护而不是简单性和效率,它可能会有所帮助。

最佳答案

如果您只想允许客户端读取数组,则不需要公共(public)属性

只需创建一个返回私有(private)可变数组副本的访问器方法:

@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

这种模式可以在例如 NSView 中看到:constraintssubviews 是内部可变的,但只能通过单一方法公开以供读取返回一个不可变的数组。

关于objective-c - 防止在公共(public)接口(interface)中将对象添加到 NSMutableArray,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15732902/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com