适用于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];
NSDecimalNumber
是NSNumber
一个子类。
如果确实有限制(实际上,我只在代码中使用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];
感谢大家的意见。 抱歉,添麻烦了。