Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.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
在Objective-C中拥有一个私有可变的公共不可变只读数组属性的最有效方法是什么?_Objective C - Fatal编程技术网

在Objective-C中拥有一个私有可变的公共不可变只读数组属性的最有效方法是什么?

在Objective-C中拥有一个私有可变的公共不可变只读数组属性的最有效方法是什么?,objective-c,Objective C,我最近在关于如何最好地在Objective-C中实现具有底层mutable存储的只读、不可变的数组属性的评论中遇到了一个小分歧(但不是不友好的意见)。(这些评论后来被移至聊天室。) 首先,让我明确我想要什么 我想要一个只读的属性,即它是不可分配的myObject.array=另一个数组应失败 我希望该属性的类型是不可变的,这样就不能通过属性本身向其添加新元素。显然,这意味着属性的类型应该是NSArray 我希望该属性的存储(即ivar)是可变的,因为我将在包含类上提供方法来对其进行变异 由于有些

我最近在关于如何最好地在Objective-C中实现具有底层mutable存储的只读、不可变的数组属性的评论中遇到了一个小分歧(但不是不友好的意见)。(这些评论后来被移至聊天室。)

首先,让我明确我想要什么

  • 我想要一个只读的属性,即它是不可分配的
    myObject.array=另一个数组应失败
  • 我希望该属性的类型是不可变的,这样就不能通过属性本身向其添加新元素。显然,这意味着属性的类型应该是
    NSArray
  • 我希望该属性的存储(即ivar)是可变的,因为我将在包含类上提供方法来对其进行变异
  • 由于有些人似乎不太清楚,让我强调一下,这个问题是关于下面
    froggbox
    类的
    frogs
    属性的,不多也不少

    我将使用链接问题中相同的人为示例,一盒青蛙,称为
    FrogBox

    @interface FrogBox : NSObject
    @property (nonatomic, readonly) NSArray *frogs;
    - (void)addFrog:(Frog*)frog;
    - (void)removeFrog:(Frog*)frog;
    @end
    
    @implementation FrogBox {
        NSMutableArray *_frogs;
    }
    
    @dynamic frogs;
    
    - (instancetype)init {
        self = [super init];
        if (self) {
            _frogs = [NSMutableArray array];
        }
        return self;
    }
    
    - (NSArray*)frogs {
        return _frogs;
    }
    
    - (void)addFrog:(Frog*)frog {
        [_frogs addObject:frog];
    }
    
    - (void)removeFrog:(Frog*)frog {
        // Frog implements isEqual and hash.
        [_frogs removeObject:frog];
    }
    
    @end
    
    现在,让我们把事情弄清楚。这里不严格需要
    @dynamic
    指令。使用
    @dynamic
    可抑制
    青蛙
    属性的ivar自动合成。当然,如果automatic synthesis看到一个ivar与它将创建的名称相同,它只使用提供的名称。那我为什么要用它呢?我认为它增加了清晰度,并表明了意图。如果你不喜欢它,就想象它不在那里。这与这个问题无关

    问题不在于想要一个公共只读、不可变和私人可变的属性是否是一个好主意。这是关于这是否是实现这一目标的最有效的方式(就语法和时钟周期而言)。我相信是的,但我想听听社区的意见,我完全愿意改变主意

  • 我想要一个只读的属性,即它是不可分配的。myObject.array=另一个数组应失败
  • 我希望该属性的类型是不可变的,这样就不能通过属性本身向其添加新元素。显然,这意味着财产的类型应该是NSArray
  • 我希望该属性的存储(即ivar)是可变的,因为我将在包含类上提供方法来对其进行变异
  • 好吧,我将给出与我在对另一个问题的评论中给出的相同的答案。我所做的是:

  • 在公共接口中声明属性a
    readonly copy
    NSArray属性。这会照顾到你的1和2;这个东西现在无法写入,它是一个不可变的数组

  • 在.m文件中私下重新声明属性
    readwrite
    。现在我有权从这个类中分配给它。为了实现一个变异方法,我使用
    mutableCopy
    阅读,调用一个NSMutableArray方法,然后设置-从而自动再次获得一个不可变的NSArray。尽管使用了“复制”一词,但实际上没有开销

  • 我想要一个只读的属性,即它是不可分配的。myObject.array=另一个数组应失败
  • 我希望该属性的类型是不可变的,这样就不能通过属性本身向其添加新元素。显然,这意味着财产的类型应该是NSArray
  • 我希望该属性的存储(即ivar)是可变的,因为我将在包含类上提供方法来对其进行变异
  • 好吧,我将给出与我在对另一个问题的评论中给出的相同的答案。我所做的是:

  • 在公共接口中声明属性a
    readonly copy
    NSArray属性。这会照顾到你的1和2;这个东西现在无法写入,它是一个不可变的数组

  • 在.m文件中私下重新声明属性
    readwrite
    。现在我有权从这个类中分配给它。为了实现一个变异方法,我使用
    mutableCopy
    阅读,调用一个NSMutableArray方法,然后设置-从而自动再次获得一个不可变的NSArray。尽管使用了“复制”一词,但实际上没有开销

  • 我想要一个只读的属性,即它是不可分配的。myObject.array=另一个数组应失败
  • 我希望该属性的类型是不可变的,这样就不能通过属性本身向其添加新元素。显然,这意味着财产的类型应该是NSArray
  • 我希望该属性的存储(即ivar)是可变的,因为我将在包含类上提供方法来对其进行变异
  • 好吧,我将给出与我在对另一个问题的评论中给出的相同的答案。我所做的是:

  • 在公共接口中声明属性a
    readonly copy
    NSArray属性。这会照顾到你的1和2;这个东西现在无法写入,它是一个不可变的数组

  • 在.m文件中私下重新声明属性
    readwrite
    。现在我有权从这个类中分配给它。为了实现一个变异方法,我使用
    mutableCopy
    阅读,调用一个NSMutableArray方法,然后设置-从而自动再次获得一个不可变的NSArray。尽管使用了“复制”一词,但实际上没有开销

  • 我想要一个只读的属性,即它是不可分配的。myObject.array=另一个数组应失败
  • 我希望该属性的类型是不可变的,这样就不能通过属性本身向其添加新元素。显然,这意味着财产的类型应该是NSArray
  • 我要仓库。