2011-12-30 2 views
4

숫자를 검색하고 싶은 NSString이 있습니다. NSNumericSearch가 적절한 해결책이 될 것으로 보이지만 분명히 :, caseInsensitiveCompare :, localizedCompare : 및 localizedCaseInsensitiveCompare : iOS에서 가져 오기를 수행 할 때 정렬 선택자로 작동합니다. (핵심 데이터 프로젝트입니다). 이것은 SQLite 데이터 저장소를 사용하는 것과 관련이 있다는 것을 이해합니다.iOS 용 NSNumericSearch 솔루션

NSNumber 문자열을 캐스팅 시도했습니다. NSNumber는 기본적으로 int이므로 ARC에 오류가 있습니다.

요약하면 (1, 11, 2, 25)와 반대의 숫자로 문자열 (1, 2, 11, 25)을 정렬하고 싶습니다. 나는 어떤 해결책을 주셔서 감사하겠습니다.

.

.

편집 : (내가 멀리 시점에서 내 컴퓨터에서였다 위 죄송하며 서둘러..)

제한된 종류의 설명자에 대한 정보 Isted & 해링턴 2011 년의 마지막 페이지에서 온다 iOS 용 Core Data를 예약하십시오.

@interface NSString (SizeComparison) 
-(NSComparisonResult)sizeCompare:(NSString*)otherString; 
@end 
@implementation NSString (SizeComparison) 
-(NSComparisonResult)sizeCompare:(NSString*)otherString { 
return [self compare:otherString options:NSNumericSearch]; 
} 
@end 

fetchedResultsCntroller의 종류의 설명은 다음과 같다 :

:이 오류를 반환

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"size" ascending:YES selector:@selector(sizeCompare:)]; 

대한 명확한

When doing a fetch with sort descriptors you'll need to restrict yourself to the following selectors on iOS: compare:, caseInsensitiveCompare:, localizedCompare:, localizedCaseInsensitiveCompare:.

는,이 같은 범주를 썼다 * 잡히지 않은 except로 인해 앱이 종료됩니다. 'NSInvalidArgumentException', 이유 : '지원되지 않는 NSSortDescriptor selector : sizeCompare :'

이것은 Isted & Harrington의 진술과 일치하는 것으로 보입니다.

또한 내가 NSNumber에 캐스팅했다고 말했을 때, 나는 간단하려고 노력했지만 분명히 분명하지 않았습니다. 이것은 내가 무슨 짓을 :

NSNumberFormatter *numformatter = [[NSNumberFormatter alloc] init]; 
numformatter.numberStyle = NSNumberFormatterNoStyle; 
self.objectToEdit.size = [numformatter numberFromString:self.sizeTextField.text]; 

그래서, 수치있는 NSString를 정렬하고 싶습니다 (1, 2, 11, 25) (1, 11, 2, 25)에 반대. 나는 여전히 모든 해결책을 고맙게 생각합니다.

+0

귀하의 질문에 이해하기가 약간 어렵습니다. 한 번 당신은 당신이 핵심 데이터를 가지고 있다고 말하는 것보다 NSString이 있다고 말합니다. 그리고 당신의 "요약"은 또 다른 것을 말합니다. 질문을 수정하고 코드 조각을 제공하십시오. 답변을 얻는 기회가 크게 증가합니다. – Krizz

+0

NSNumber가 정수가 아닙니다. –

+0

@ Krizz 당신 말이 맞아요. 그것은 비참한 게시물이었다. 나는 분명히하려고 애썼다. – Kurt

답변

8

나는 마침내 문자열을 숫자로 정렬하는 문제에 대한 해답을 발견했다. 블록 사용을 직접적으로 포함합니다. 내 정렬 설명자의 경우 간단히 다음과 같습니다.

NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"size" ascending:NO comparator:^(id obj1, id obj2) { return [obj1 compare:obj2 options:NSNumericSearch]; }]; 

이렇게하면 NSString을 숫자순으로 정렬 할 수 있습니다 (1, 11, 2, 25).

카테고리가 작동하지 않는 이유가 확실하지 않습니다. 나는 같은 문제를 겪고있는 다른 사람들을 위해 대답을 게시 할 것이라고 생각했다.

+0

이것은 사랑 스럽다. 고맙습니다. (블록은 악마에서 나온 것이지만). – CBGraham

0

apparently only compare:, caseInsensitiveCompare:, localizedCompare: and localizedCaseInsensitiveCompare: work as sort selectors when doing a fetch in iOS

정말요? 난 당신이 사용하는 선택기가 하나의 매개 변수 (비교할 다른 문자열) 걸릴 수 있습니다 더 많은 문제라고 생각하고 -compare:options: 숫자 비교를 할 필요가있다.

예를 들어 비교를 수행 할 카테고리 방법을 작성해보십시오.

@interface NSString(NumericCompare) 

-(NSComparisionResult) compareNumerically: (NSString*) anotherString; 

@end 

@implementation NSString(NumericCompare) 

-(NSComparisionResult) compareNumerically: (NSString*) anotherString 
{ 
    return [self compare: anotherString options: NSNumericSearch]; 
} 

I have tried casting the string to an NSNumber. There is an error with ARC, as NSNumber is basically an int.

당신은 당신이 단지 포인터를 캐스팅,의 NSNumber에 NSSstring 캐스팅 할 수는없는 개체는 지적했다. 이

NSNumber* number = [NSDecimalNumber numberWithString: myStringValue]; 

NSDecimalNumberNSNumber의 서브 클래스 할 수 있습니다.

+0

JeremyP에 감사드립니다. 귀하의 배려에 감사드립니다. 보시다시피, 나는 당신과 거의 같은 범주 방법을 시도했습니다. 내 편집 게시물에서 오류 메시지를 볼 수 있습니다. – Kurt

0

실제로 제한이있는 경우 (실제로 코드에서 localizedCaseInsensitiveCompare: 만 사용) sortDescriptorWithKey:ascending:comparator:을 사용하고 블록에서 NSNumericSearch를 사용할 수 있어야합니다.

0

나는 NSNumericSearch없이 필요한 것을 할 수있었습니다.

'size'속성을 Integer16으로 변경하고 모델 클래스 속성 'size'를 NSString에서 NSNumber로 변경하고 간단한 마이그레이션을 수행했습니다.

는 그럼 난 내 기존 코드를 사용하여 조금 수정 :

aString = [aNumber stringValue]; 

NSNumberFormatter *numformatter = [[NSNumberFormatter alloc] init]; 
numformatter.numberStyle = NSNumberFormatterNoStyle; 
bNumber = [numformatter numberFromString:bString] 

적절한있는 NSString과의 NSNumber 객체를 변경하는 방법.

이제는 원하는대로 정렬됩니다.

요약하면 데이터 구조를 변경하여 NSString을 숫자순으로 정렬하는 전체적인 문제를 피할 수 있습니다. 모든 사람의 입력을위한

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:sortKey1 ascending:YES]; 
NSSortDescriptor *sortDescriptor2 = [[NSSortDescriptor alloc] initWithKey:@"size" ascending:YES]; 
NSArray *sortDescriptors = [NSArray arrayWithObjects:sortDescriptor,sortDescriptor2, nil]; 

감사 :

정렬 기술자는 fetchedResultsController에 사용되는 단지 기본적인 것들이었다. 문제를 일으켜서 미안 해요.