我正在尝试获取标题的第一个字母/数字,这是一个对象的 NSString 属性。该属性有时可能为 nil 或 = @"",因此我需要对此进行补偿。如果 标题以数字开头,我需要返回@"#"。如果它以“The Cup”开头,我需要返回“C”而不考虑“The”。如果它是空的,我需要返回 U 表示未知。
我已经创建了以下脚本,但在搜索 1000 个标题时速度非常慢。有时我还会收到 -[__NSCFString substringToIndex:]: Index 1 out of bounds;字符串长度 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;
}
最佳答案
这应该会快一些
- (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];
}
关于ios - 获取标题的第一个实际字母/数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19392106/