【问题标题】:Set bool property of all objects in the array设置数组中所有对象的布尔属性
【发布时间】:2016-01-05 23:05:35
【问题描述】:

我有一个名为 PhotoItem 的模型类。其中我有一个BOOL 属性isSelected

@interface PhotoItem : NSObject

/*!
 * Indicates whether the photo is selected or not
 */
@property (nonatomic, assign) BOOL isSelected;

@end

我有一个NSMutableArray,它保存了这个特定模型的对象。我想要做的是,在特定事件中,我想将数组中所有对象的布尔值设置为 true 或 false。我可以通过遍历数组并设置值来做到这一点。

而不是我尝试使用:

[_photoItemArray makeObjectsPerformSelector:@selector(setIsSelected:) withObject:[NSNumber numberWithBool:true]];

但我知道它不会起作用,但它没有。此外,我不能将 true 或 false 作为其中的参数传递(因为它们不是对象类型)。所以为了解决这个问题,我实现了一个自定义的公共方法,比如:

/*!
 * Used for setting the photo selection status
 * @param selection : Indicates the selection status
 */
- (void)setItemSelection:(NSNumber *)selection
{
    _isSelected = [selection boolValue];
}

然后这样称呼它:

[_photoItemArray makeObjectsPerformSelector:@selector(setItemSelection:) withObject:[NSNumber numberWithBool:true]];

效果很好。但我的问题是,有没有更好的方法可以在不实现自定义公共方法的情况下实现这一点?

【问题讨论】:

  • 您是否尝试在对象数组上使用“for 循环”?
  • 我认为你走对了。
  • 旁注:该属性的isSelected 名称似乎有点奇怪。 Apple 使用一种方案,其中布尔属性用一个简单的形容词命名,并且有一个使用“is”前缀的 setter name,例如 @property (getter=isSelected) BOOL selected;。这甚至记录在 KVC 指南中,解释如何解析密钥。

标签: ios objective-c boolean nsmutablearray


【解决方案1】:

有没有更好的方法在不实现自定义公共方法的情况下实现这一点?

这听起来像是你在征求意见,所以这是我的:保持简单。

for (PhotoItem *item in _photoItemArray)
    item.isSelected = YES;

既然您可以编写任何人都会立即理解的代码,为什么还要通过晦涩难懂的方法绕道而行来混淆简单的事情?

做同样事情的另一种方法是:

[_photoItemArray setValue:@YES forKey:@"isSelected"];

这不需要自定义的附加 setter 方法,因为 KVC 会为您完成拆箱。

但我还是会投票反对使用这种结构。我认为他们分散了对简单含义的注意力,并使追随您的开发人员感到困惑。

【讨论】:

  • +1 这里值得强调一下YES的使用,和true不一样,是原代码的错误之一。 (但同意,for 循环是最好的。)
  • 对我来说,使用 KVC 似乎与 for 循环方法一样清晰,一旦您知道数组上的 KVC 方法将操作转发到数组中的每个项目。在我看来,学习这有点像习惯了三元 (?:) 运算符。最初几次遇到它似乎很奇怪,然后变得自然。 KVC 确实有一些开销,所以 for..in 循环的性能可能会稍微高一点,但除了最大的数组之外,其他所有数组都无法检测到差异。
  • @RobNapier:我不明白你的评论。你能详细说明一下吗?使用 true 的原始代码有什么错误?据我了解,YES 和 true 都具有相同的目的(如果我错了,请纠正我)
  • “相同的目的”肯定是因为它们都是“类似真实的东西”。但它们是不同的类型。一般来说,你不能用一个来代替另一个(它可能导致的错误真的很棒;我有很多很棒的变量,它们是真、非真、假或非假,这取决于你如何测试它们)。在处理 ObjC 的大多数情况下,您需要YES。很少使用true(仅在语言中,因为它是从最近对 C 的更新继承而来的)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-02
  • 2013-10-03
  • 2018-11-22
  • 1970-01-01
相关资源
最近更新 更多