Vì vậy, cá nhân tôi thực sự ghét NSNotFound
nhưng hiểu sự cần thiết của nó.
Nhưng một số người có thể không hiểu sự phức tạp của việc so sánh với NSNotFound
Ví dụ: mã này:
- (BOOL)doesString:(NSString*)string containString:(NSString*)otherString {
if([string rangeOfString:otherString].location != NSNotFound)
return YES;
else
return NO;
}
có vấn đề của nó:
1) Rõ ràng nếu otherString = nil
mã này sẽ sụp đổ. một bài kiểm tra đơn giản sẽ là:
NSLog(@"does string contain string - %@", [self doesString:@"hey" containString:nil] ? @"YES": @"NO");
kết quả trong !! TAI NẠN !!
2) Điều không rõ ràng đối với người mới sử dụng object-c là cùng một mã sẽ KHÔNG gặp sự cố khi nào string = nil
. Ví dụ: mã này:
NSLog(@"does string contain string - %@", [self doesString:nil containString:@"hey"] ? @"YES": @"NO");
và mã này:
NSLog(@"does string contain string - %@", [self doesString:nil containString:nil] ? @"YES": @"NO");
cả hai sẽ dẫn đến
does string contains string - YES
Mà rõ ràng KHÔNG phải là những gì bạn muốn.
Vì vậy, giải pháp tốt hơn mà tôi tin là có hiệu quả là sử dụng thực tế là RangeOfString trả về độ dài bằng 0 để mã tốt hơn đáng tin cậy hơn là:
- (BOOL)doesString:(NSString*)string containString:(NSString*)otherString {
if(otherString && [string rangeOfString:otherString].length)
return YES;
else
return NO;
}
HOẶC ĐƠN GIẢN:
- (BOOL)doesString:(NSString*)string containString:(NSString*)otherString {
return (otherString && [string rangeOfString:otherString].length);
}
sẽ cho trường hợp 1 và 2 sẽ trở lại
does string contains string - NO
Đó là 2 xu của tôi ;-)
Vui lòng kiểm tra Gist của tôi để biết thêm mã hữu ích.