代码之家  ›  专栏  ›  技术社区  ›  Oh Danny Boy

我怎样才能洗牌?

  •  0
  • Oh Danny Boy  · 技术社区  · 14 年前

    我在重组数组中找到的所有例子都是针对NSmutableArrays的。将一个NSarray复制到一个NSmutable数组中,进行洗牌,然后再复制回来,总是会使应用程序崩溃。有没有可能洗牌?

    ObjuleC中的任何东西与集合相似。

    编辑

    static NSUInteger random_below(NSUInteger n) {
    NSUInteger m = 1;
    
    do {
        m <<= 1;
    } while(m < n);
    
    NSUInteger ret;
    
    do {
        ret = random() % m;
    } while(ret >= n);
    
    return ret;
    }
    - (NSArray *)loadAllData{
        XYZAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
    
        NSManagedObjectContext *managedObjectContext = appDelegate.managedObjectContext;
        NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
        NSEntityDescription *entity = [NSEntityDescription entityForName:@"Quote" inManagedObjectContext:managedObjectContext]; 
        NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"id" ascending:YES];  
        NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];   
    
        [request setSortDescriptors:sortDescriptors];
        [request setEntity: entity]; 
    
        NSError *myError;   
        NSArray *theResults = [managedObjectContext executeFetchRequest:request error:&myError];
    
        if (theResults == nil) {
            NSLog(@"Testing: No results found");
        }else {
            NSLog(@"Testing: Results found.");
        }
    
        [request release];
        [sortDescriptors release];
    
        for(NSUInteger i = [theResults count]; i > 1; i--) {
            NSUInteger j = random_below(i);
            [theResults exchangeObjectAtIndex:i-1 withObjectAtIndex:j];
        }
    
        return theResults;
    }
    
    
    
    
    warning: 'NSArray' may not respond to '-exchangeObjectAtIndex:withObjectAtIndex:' which crashed the application.     
    
    error: *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[_PFArray exchangeObjectAtIndex:withObjectAtIndex:]: unrecognized selector sent to instance 0x3d35a40
    
    1 回复  |  直到 14 年前
        1
  •  2
  •   Tom H    14 年前

    好啊。我想我看到了一个问题。始终查看错误消息。我以为你说你在这个函数中使用了nsmutablearrays?

    NSArray *theResults = [managedObjectContext executeFetchRequest:request error:&myError];
    

    把它变成

    NSMutableArray *theResults = [[managedObjectContext executeFetchRequest:request error:&myError] mutableCopy];
    

    告诉我它是否起作用,如果不起作用,我会尽力帮忙的。

    更多信息:

    -exchangeObjectAtIndex:withObjectAtIndex:
    

    是非诱变数组的一种方法。您使用的是NSARRAY,它们是NSARRAY的不同类(NSmutableArray是NSARRAY的一个子类(并且添加了表示您可以修改它的方法)。