适用于iOS的NSNumericSearch解决scheme

我有一个NSString,我想用数字search。 看来,NSNumericSearch将是合适的解决scheme,但显然只比较:,caseInsensitiveCompare:,localizedCompare:和localizedCaseInsensitiveCompare:在iOS中执行提取操作时作为sortingselect器。 (这是一个核心数据项目)。 我的理解是,这与SQLite后台数据存储有关。

我曾尝试将string转换为NSNumber。 ARC有错误,因为NSNumber基本上是一个int。

总之,我想用数字sorting一个string(1,2,11,25),而不是(1,11,2,25)。 我会感谢任何解决scheme。

编辑:(我很抱歉,我当时远离电脑,急着。)

关于有限sorting描述符的信息来自Isted&Harrington 2011年版“iOS核心数据”的最后一页。

当使用sorting描述符进行提取时,您需要限制自己到iOS上的以下select器:比较:,caseInsensitiveCompare:,localizedCompare:,localizedCaseInsensitiveCompare:。

为了澄清,我写了这样一个类别:

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

fetchedResultsCntroller中的sorting描述符如下所示:

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

它返回这个错误:

*由于未捕获exception“NSInvalidArgumentException”而终止应用程序,原因:“不受支持的NSSortDescriptorselect器:sizeCompare:”

这似乎与Isted&Harrington的陈述是一致的。

另外,当我说我投到NSNumber时,我试图简短,但显然不清楚。 这就是我所做的:

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

所以,我想对NSString进行数值sorting(1,2,11,25),而不是(1,11,2,25)。 我仍然会欣赏任何解决scheme。

我终于find了数字sortingstring的问题的答案。 它涉及到直接使用块。 对于我的sorting描述符,它很简单:

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

这允许NSStrings数字sorting(1,11,2,25)。

我不知道为什么一个类别没有工作。 以为我会为其他人遇到同样的问题发表答案。

显然只有比较:,caseInsensitiveCompare:,localizedCompare:和localizedCaseInsensitiveCompare:在iOS中执行一个提取操作时作为sortingselect器

真? 我想这个问题更多的是你使用的select器只能接受一个参数(另一个string来比较),你需要使用-compare:options:做一个数字比较。

尝试写一个类别的方法来做比较,例如

 @interface NSString(NumericCompare) -(NSComparisionResult) compareNumerically: (NSString*) anotherString; @end @implementation NSString(NumericCompare) -(NSComparisionResult) compareNumerically: (NSString*) anotherString { return [self compare: anotherString options: NSNumericSearch]; } 

我曾尝试将string转换为NSNumber。 ARC有错误,因为NSNumber基本上是一个int。

你不能只将一个NSString转换为一个NSNumber,你只是投射指针,而不是指向的对象。 你可以这样做

 NSNumber* number = [NSDecimalNumber numberWithString: myStringValue]; 

NSDecimalNumberNSNumber一个子类。

如果确实有限制(实际上,我只在代码中使用localizedCaseInsensitiveCompare:),那么应该可以使用sortDescriptorWithKey:ascending:comparator:并在您的代码块中使用NSNumericSearch。

没有NSNumericSearch,我能够完成我所需要的工作。

我更改了核心数据结构,将“size”属性更改为Integer16,并将模型类属性“size”从NSString更改为NSNumber,并进行了轻量级迁移。

然后我使用下面的代码修改了我现有的代码:

 aString = [aNumber stringValue]; 

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

在适当的时候改变NSString和NSNumber对象。

现在它有点像我的愿望。

总之,我避免了通过改变数据结构来对NSString进行数字sorting的问题。

sorting描述符只是在fetchedResultsController中使用的基本描述符:

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

感谢大家的意见。 抱歉,添麻烦了。