0

我正在尝试获取标题的第一个字母/数字,它是对象的 NSString 属性。该属性有时可能为 nil 或 = @"",因此我需要对此进行补偿。如果标题以数字开头,我需要返回@"#"。如果它以“The Cup”开头,我需要返回“C”而忽略“The”。如果它是空的,我需要为未知返回 U。

我已经创建了下面的脚本,但是在搜索 1000 个标题时它非常慢。有时我也会收到一个-[__NSCFString substringToIndex:]: Index 1 out of bounds; string length 0. 我认为这与空字符串有关?任何其他方法,如正则表达式或我可以用来加快查询速度的方法?

- (NSString *)firstLetterInTitle{
        NSString *newString = [self.title uppercaseString];
        NSNumberFormatter *f = [[NSNumberFormatter alloc] init];
            if([newString length] >= 1){
                if([f numberFromString:[newString substringToIndex:1]] != nil){
                    //All Numbers
                    _firstLetterInTitle = @"#";
                    return _firstLetterInTitle;
                }

                //" Hello"
                if([newString length] >= 2){
                    if([[newString substringToIndex:1] isEqualToString:@" "]){
                        newString = [newString stringByTrimmingCharactersInSet:
                             [NSCharacterSet whitespaceCharacterSet]];
                //Returns "Hello"
                    }
                }

        if([newString length] >= 5){
            if([[newString substringToIndex:4] isEqualToString:@"THE "]){
                newString = [newString substringFromIndex:4];
            }
        }

    }else{
        _firstLetterInTitle = @"U";
        return _firstLetterInTitle;
    }

    newString = [[newString componentsSeparatedByCharactersInSet:[[NSCharacterSet letterCharacterSet] invertedSet]] componentsJoinedByString:@""];
    if([newString length] >= 1){
        _firstLetterInTitle = [newString substringToIndex:1];
    }else{
        _firstLetterInTitle = @"U";
    }
        return _firstLetterInTitle;
}
4

1 回答 1

4

这应该更快一些

- (NSString *)firstLetterInTitle
{
    if (!self.title || ([self.title isEqualToString:@""])) {
        return @"U";
    }

    if ([[NSCharacterSet decimalDigitCharacterSet] characterIsMember:[self.title characterAtIndex:0]]) {
        return @"#";
    }

    NSString *newString = [self.title uppercaseString];
    if (([newString hasPrefix:@"THE "]) && ([newString length > 4)) {
        newString = [newString substringFromIndex:4];
    }

    return [newString substringToIndex:1];
}
于 2013-10-15T22:43:10.327 回答