【问题标题】:iOS - Shuffle/Randomize order of objects in NSMutableArrayiOS - 随机/随机化 NSMutableArray 中对象的顺序
【发布时间】:2017-02-17 02:46:28
【问题描述】:

当执行 reloadData 方法时,我想随机化/随机化 NSMutableArray 中项目的顺序。我尝试了以下方法,但控制台不断向我抛出以下错误:

由于未捕获的异常而终止应用程序 'NSInvalidArgumentException',原因:'-[__NSArrayI exchangeObjectAtIndex:withObjectAtIndex:]:发送了无法识别的选择器 到实例 0x1748b2c60'

知道为什么会这样吗?我被难住了。

ViewController.h

@property (strong, retain) NSMutableArray *neighbourData;

ViewController.m

- (void)reloadData:(id)sender
{


     NSMutableDictionary *viewParams = [NSMutableDictionary new];
            [viewParams setValue:@"u000" forKey:@"view_name"];
            [DIOSView viewGet:viewParams success:^(AFHTTPRequestOperation *operation, id responseObject) {



                self.neighbourData = (NSMutableArray *)responseObject;

                [self.tableView reloadData];

                NSUInteger count = [self.neighbourData count];
                for (NSUInteger i = 0; i < count; ++i) {
                    // Select a random element between i and end of array to swap with.
                    int nElements = count - i;
                    int n = (arc4random() % nElements) + i;
                    [self.neighbourData exchangeObjectAtIndex:i withObjectAtIndex:n];
                }


                NSLog(@"This is the neighbourdata %@",self.neighbourData);


            } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
                NSLog(@"Failure: %@", [error localizedDescription]);
            }];

【问题讨论】:

    标签: ios objective-c


    【解决方案1】:

    错误表明responseObject实际上是一个不可变的NSArray。您应用的强制转换只是依赖于编译器,但它实际上并没有在运行时改变任何东西。

    变化:

    self.neighbourData = (NSMutableArray *)responseObject;
    

    到:

    self.neighbourData = [(NSArray *)responseObject mutableCopy];
    

    【讨论】:

    • 对于OP来说,这是学习的重点。将变量转换为不同的类型不会改变底层对象的类型。它只是强制编译器认为它是一个不同的类型。如果对象不是可变数组,您需要一个函数 (mutableCopy),它将不可变数组作为参数,并返回一个包含相同对象的新可变数组。
    【解决方案2】:

    对于生产你真的应该使用内置的Fisher-Yates shuffle in Gamekit。如果您这样做是出于学习目的,那么问题就出在这条线上:

    int n = (arc4random() % nElements) + i;
    

    你正在从第一个元素到最后一个元素创建一个随机数然后你将 i 添加到它。显然,这意味着您的索引现在可能超出范围。去掉+ i。

    【讨论】:

    • 这个答案没有试图解决问题中提出的问题。
    • 这是一个有效的观点,但正如 rmaddy 所说,这不是对所提问题的回答。
    【解决方案3】:

    self.neighbourData = (NSMutableArray *)responseObject; 您必须确保您的 responseObject 是 NSMutableArray 的实例。即使您将类型 responseObject 转换为 NSMutableArray,如果它不是 NSMutableArray 的实例,它也会崩溃,因为它没有 exchangeObjectAtIndex:withObjectAtIndex:。在这种情况下,您的 responseObject 是一个 NSArray 实例,您可以将代码更改为: NSArray *tmp = (NSArray *)responseObject; self.neighbourData = [tmp mutableCopy]; 我认为这对你有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-14
      • 2012-06-13
      • 2020-03-20
      • 2021-10-23
      • 2012-11-19
      • 2019-04-04
      • 1970-01-01
      • 2012-07-09
      相关资源
      最近更新 更多