NSString: isEqual กับ isEqualToString


94

อะไรคือความแตกต่างระหว่างisEqual:และisEqualToString:?

ทำไมเรียนเพิ่ม isEqualTo * วิธีการ (isEqualToArray สำหรับ NSArray, isEqualToData สำหรับ NSData, ... ) แทนเพียงเอาชนะisEqual:?

คำตอบ:


103

isEqual:เปรียบเทียบสตริงกับอ็อบเจ็กต์และจะส่งคืนNOหากอ็อบเจ็กต์ไม่ใช่สตริง isEqualToString:จะเร็วกว่าถ้าคุณรู้ว่าวัตถุทั้งสองเป็นสตริงตามที่เอกสารระบุ:

ข้อควรพิจารณาพิเศษ

isEqual:เมื่อคุณรู้ว่าวัตถุทั้งสองเป็นสตริงวิธีนี้เป็นวิธีที่เร็วกว่าในการตรวจสอบความเท่าเทียมกันมากกว่า

isEqualTo<Class>ใช้เพื่อตรวจสอบความเท่าเทียมกันโดยเฉพาะ ตัวอย่างเช่น; isEqualToArray:ตรวจสอบว่าอาร์เรย์ประกอบด้วยอ็อบเจ็กต์จำนวนเท่ากันและอ็อบเจ็กต์ในดัชนีที่กำหนดส่งกลับYESสำหรับการisEqual:ทดสอบ


3
หากคุณเชื่อว่า Aaron Hillegass ไม่มีความแตกต่างด้านประสิทธิภาพความปลอดภัยเพียงเล็กน้อย: blog.bignerdranch.com/334-isequal-vs-isequaltostring
Caro

2
ขอบคุณสำหรับลิงค์ - มีประโยชน์ แม้ว่าคุณจะขอให้เราเชื่อ Mark Dalrymple - ฉันเป็นใคร :)
Abizern


16

นอกจากนี้สำหรับการเขียน-isEqual:และ-isEqualTo<Class>:วิธีการของคุณเองอนุสัญญาคือการอนุญาตให้ไม่มีอาร์กิวเมนต์-isEqual:และยกข้อยกเว้นสำหรับอาร์กิวเมนต์ศูนย์-isEqualTo<Class>:


1
ฉันไม่เคยเจอสิ่งนี้มาก่อนเอกสารใดที่คุณรู้
Mike Abdullah

2
สิ่งนี้ดูเหมือนจะไม่เป็นจริงสำหรับ isEqualToString ซึ่งจะคืนค่า NO หากคุณส่งผ่านเป็นศูนย์
Jaka Jančar

9
สิ่งที่น่าสนใจมีการบันทึกไว้ในส่วนการเปรียบเทียบวัตถุของ <a href=" developer.apple.com/documentation/Cocoa/Conceptual/…คู่มือความรู้พื้นฐาน </a>
Jonathan Dann

นี่ไม่เป็นความจริง. isEqualToString ไม่ยกข้อยกเว้น
เคารพ TheCode

1
หน้าเว็บ Cocoa Fundamentals Guide ระบุว่า "เอกสารนี้อาจไม่ได้แสดงถึงแนวทางปฏิบัติที่ดีที่สุดสำหรับการพัฒนาในปัจจุบัน" เห็นได้ชัดว่ามันเก่า
cbh2000

5

ฉันเดาว่ามันมีการปรับปรุงประสิทธิภาพเล็กน้อยเนื่องจาก isEqualToString: ไม่ต้องพิมพ์ตรวจสอบสิ่งที่ส่งเข้ามา


การคาดเดาของคุณอาจเป็นจริง :)
Philip007

5

ขยายคำตอบของ @Abizern และ @Jonathan Dann ทั้งคู่isEqualและisEqualToStringทำงานอย่างมีnilคุณค่า

- (void)testStringEqual {
    NSString *string = nil;

    STAssertFalse([string isEqual:@"test"], @"NSString isEqual");
    STAssertFalse([string isEqualToString:@"test"], @"NSString isEqualToString");

    // Note that these both return NO
    STAssertFalse([string isEqual:nil], @"NSString isEqual");
    STAssertFalse([string isEqualToString:nil], @"NSString isEqualToString");

    string = @"test";

    STAssertTrue([string isEqual:@"test"], @"NSString isEqual");
    STAssertTrue([string isEqualToString:@"test"], @"NSString isEqualToString");

    STAssertFalse([string isEqual:nil], @"NSString isEqual");
    STAssertFalse([string isEqualToString:nil], @"NSString isEqualToString");
}

4

ผมขอแนะนำให้นี้ ประโยชน์ด้านประสิทธิภาพของ isEqualToString นั้นมีความสำคัญน้อยมากสำหรับแอปพลิเคชันส่วนใหญ่ แต่มีอีกสองความแตกต่างที่ผู้เขียนกล่าวถึง:

  • ประเภทความปลอดภัย
  • วิธีnilจัดการ

ฉันไม่เห็นความแตกต่างใด ๆ ในวิธีการจัดการศูนย์ทั้งสอง อย่าเป็นผู้รับหรือข้อโต้แย้งหรือทั้งสองอย่าง
SayeedHussain

ไม่ว่า "สิ่งนี้" จะไม่มีอยู่แล้ว: /
Jared Grubb

1
ขอบคุณ @JaredGrubb ฉันพบ URL ใหม่
Ben Packard
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.