2012-01-08 4 views
0

Я использую несколько NSComparators в своем приложении iOS, которые сравнивают объекты по свойствам NSString или NSNumber. Это довольно легко, потому что NSString имеет caseInsensitiveCompare: и NSNumber имеет compare:. Как сравнить bools или ints? Для булевых кодов код может довольно запутанно запутываться, так как мои функции сравнения принимают параметр (bool)ascending. Я заметил, что Objective C часто имеет неясные глобальные функции для этого типа вещей.Сравнение логических и целых чисел

В настоящее время я использую этот код для сравнения булевых:

NSComparator comp = ^(id id1, id id2) { 
    ListItem *comp1 = nil, 
      *comp2 = nil; 
    if([id1 isKindOfClass:[ListItem class]]){ 
     if(ascending){ 
      comp1 = (ListItem*)id1; 
      comp2 = (ListItem*)id2; 
     }else{ 
      comp1 = (ListItem*)id2; 
      comp2 = (ListItem*)id1; 
     } 
    } 
    if(h1!=nil && h2!=nil){ 
     if((h1.isInBasket && h2.isInBasket) || (!h1.isInBasket && !h2.isInBasket)){ 
      return 0; 
     } else if(h1.isInBasket && !h2.isInBasket) { 
      return 1; 
     } else { 
      return -1; 
     } 
    } else { 
     return 0; 
    } 

}

+3

=,! =, <, >? =) – jrturton

ответ

2

BOOLS (BOOL, Boolean) и целых чисел (int, long, unsigned и т.д.) просто C интеграл типы, и вы сравниваете их со стандартными операторами сравнения C <, >, == и т. д. То же самое относится к char (также интегральный тип), float и т. д. и название d, например NSInteger.

+0

На самом деле это не то, на что я надеялся, но спасибо. Я добавил свой код к исходному сообщению. К сожалению, моя булевая алгебра немного ржавая. – Echilon

+1

Если вам нужен простой способ сделать это, следующий макрос должен сделать трюк: '#define COMPARE (A, B) ({__typeof __ (A) __a = (A); __typeof __ (B) __b = (B); __a == __b? NSOrderedSame: (__a <__b? NSOrderedAscending: NSOrderedDescending;}) '. – CRD

+0

@CRD красивый макрос! Отсутствует закрывающая скобка после b во втором сравнении, хотя –