【问题标题】:Comparing a NSMutableArray using block使用块比较 NSMutableArray
【发布时间】:2012-05-20 14:21:49
【问题描述】:

我有 NSMutableArray* names,其中包含 NSStrings。我想用caseInsensitiveCompare 方法对数组进行排序。

这是我写的代码:

names= [names sortedArrayUsingComparator: ^ NSComparisonResult (id obj1, id obj2)
            {
                return [obj1 caseInsensitiveCompare: obj2];
            }];

问题是 sortedArrayUsingComparator 返回的是 NSArray 而不是 NSMutableArray,我在运行时收到了警告和此代码的问题。
有没有办法将 NSArray 转换为 NSMutableArray?还是我必须复制所有元素?最后一个解决方案很昂贵:有人可以提出一个好的、低开销的解决方案吗?

【问题讨论】:

    标签: objective-c nsmutablearray nsarray


    【解决方案1】:

    请注意,您正在使用的函数的名称 (sortedArrayUsingComparator) 告诉您它将返回一个数组而不是可变数组。使用 NSArray 的 mutableCopy 方法获取可变副本。

    names= [[names sortedArrayUsingComparator: ^ NSComparisonResult (id obj1, id obj2)
           {
               return [obj1 caseInsensitiveCompare: obj2];
           } ] mutableCopy];
    

    或者,更容易阅读/遵循:

    NSArray *namesArray = [names sortedArrayUsingComparator:^NSComparisonResult (id obj1, id obj2) {
           return [obj1 caseInsensitiveCompare: obj2];
           }];
    names = [namesArray mutableCopy];
    

    【讨论】:

    • 您真的应该只使用-sortUsingComparator 进行就地排序。
    • @RichardJ.RossIII, +1 但我也想说他应该只使用-sortUsingSelector:,因为他的比较器只是使用一种简单、现成的比较方法。 [names sortUsingSelector:@selector(caseInsensitiveCompare:)]
    • 我同意这样会更好!我被困在回答他提出的问题而不是提供更好的解决方案。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-16
    相关资源
    最近更新 更多