【问题标题】:NSNumericSearch solution for iOS适用于 iOS 的 NSNumericSearch 解决方案
【发布时间】:2011-12-30 13:51:03
【问题描述】:

我有一个 NSString,我想用数字搜索。似乎 NSNumericSearch 将是合适的解决方案,但显然只有 compare:、caseInsensitiveCompare:、localizedCompare: 和localizedCaseInsensitiveCompare: 在 iOS 中进行提取时用作排序选择器。 (这是一个核心数据项目)。据我了解,这与 SQLite 支持数据存储有关。

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

总之,我想对字符串进行数字排序(1、2、11、25)而不是(1、11、2、25)。我会很感激任何解决方案。

.

.

编辑:(我为上述道歉。当时我不在电脑旁,而且很匆忙。)

有关有限排序描述符的信息来自 Isted & Harrington 2011 年出版的《Core Data for iOS》一书的最后一页。

在使用排序描述符进行 fetch 时,您需要将自己限制为 iOS 上的以下选择器: 比较:, 不区分大小写比较:, 本地化比较:, 本地化CaseInsensitiveCompare:.

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

@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:)];

它返回此错误:

* 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“不支持的 NSSortDescriptor 选择器: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)。我仍然会很感激任何解决方案。

【问题讨论】:

  • 你的问题有点难以理解。有一次你说你有 NSString,而不是你说你有核心数据。你的“总结”说的是另一件事。请完善您的问题并提供一些代码 sn-ps。这将大大增加获得答案的机会。
  • @Krizz 你是对的。这是一个糟糕的帖子。我试图澄清。
  • @DavidDunham 我说得不好。
  • NSNumber 是一个对象,它有 compare: 应该根据您的需要返回正确的顺序。您在使用NSNumber 时遇到了什么问题?

标签: objective-c ios


【解决方案1】:

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

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

这允许对 NSStrings 进行数字排序(1、11、2、25)。

我不确定为什么某个类别不起作用。以为我会为遇到相同问题的其他人发布答案。

【讨论】:

  • 这很可爱。谢谢你。 (虽然积木来自魔鬼。)
【解决方案2】:

显然只有 compare:、caseInsensitiveCompare:、localizedCompare: 和localizedCaseInsensitiveCompare: 在 iOS 中进行提取时用作排序选择器

真的吗?我认为问题更多在于您使用的选择器只能采用一个参数(要比较的另一个字符串),您需要使用 -compare:options: 进行数字比较。

尝试编写一个类别方法来进行比较,例如

@interface NSString(NumericCompare)

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

@end

@implementation NSString(NumericCompare)

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

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

您不能只将 NSSstring 转换为 NSNumber,您只是在转换指针,而不是指向的对象。你可以这样做

NSNumber* number = [NSDecimalNumber numberWithString: myStringValue];

NSDecimalNumberNSNumber 的子类。

【讨论】:

  • 谢谢 JeremyP。感谢您的考虑。如您所见,我尝试了与您的几乎相同的类别方法。您可以在我编辑的帖子中看到错误消息。
【解决方案3】:

如果真的有限制(事实上,我在代码中只使用了localizedCaseInsensitiveCompare:),你应该可以使用sortDescriptorWithKey:ascending:comparator: 并在你的块中使用NSNumericSearch。

【讨论】:

    【解决方案4】:

    在没有 NSNumericSearch 的情况下,我能够完成我需要的工作。

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

    然后我稍微修改了我现有的代码:

    aString = [aNumber stringValue];
    

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

    在适当的地方更改 NSString 和 NSNumber 对象。

    现在它就像我想要的那样。

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

    排序描述符只是 fetchedResultsController 中使用的基本描述符:

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

    感谢大家的意见。给您添麻烦了。

    【讨论】:

      猜你喜欢
      • 2018-09-27
      • 1970-01-01
      • 2019-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多