โดยส่วนตัวแล้วฉันเกลียดจริง ๆNSNotFound
แต่เข้าใจความจำเป็น
แต่บางคนอาจไม่เข้าใจความซับซ้อนของการเปรียบเทียบกับ NSNotFound
ตัวอย่างเช่นรหัสนี้:
- (BOOL)doesString:(NSString*)string containString:(NSString*)otherString {
if([string rangeOfString:otherString].location != NSNotFound)
return YES;
else
return NO;
}
มีปัญหา:
1) ชัดเจนว่าotherString = nil
รหัสนี้จะผิดพลาด การทดสอบอย่างง่ายจะเป็น:
NSLog(@"does string contain string - %@", [self doesString:@"hey" containString:nil] ? @"YES": @"NO");
ผลลัพธ์ใน !! ผิดพลาด !!
2) สิ่งที่ไม่ชัดเจนสำหรับบางคนที่เพิ่งรู้จักกับ object-c คือรหัสเดียวกันจะไม่ผิดพลาดเมื่อstring = nil
ใด ตัวอย่างเช่นรหัสนี้:
NSLog(@"does string contain string - %@", [self doesString:nil containString:@"hey"] ? @"YES": @"NO");
และรหัสนี้:
NSLog(@"does string contain string - %@", [self doesString:nil containString:nil] ? @"YES": @"NO");
จะส่งผลให้ทั้งคู่
does string contains string - YES
ซึ่งเห็นได้ชัดว่าไม่ใช่สิ่งที่คุณต้องการ
ดังนั้นทางออกที่ดีกว่าที่ฉันเชื่อว่าใช้งานได้คือการใช้ความจริงที่ rangeOfString ส่งคืนความยาวเป็น 0 ดังนั้นรหัสที่น่าเชื่อถือมากขึ้นก็คือ
- (BOOL)doesString:(NSString*)string containString:(NSString*)otherString {
if(otherString && [string rangeOfString:otherString].length)
return YES;
else
return NO;
}
หรือ SIMPLY:
- (BOOL)doesString:(NSString*)string containString:(NSString*)otherString {
return (otherString && [string rangeOfString:otherString].length);
}
ซึ่งจะสำหรับกรณีที่ 1 และ 2 จะกลับมา
does string contains string - NO
นั่นคือ 2 เซ็นต์ของฉัน ;-)
โปรดตรวจสอบGistของฉันเพื่อรับรหัสที่เป็นประโยชน์เพิ่มเติม