Сравнение значений типа swift в модульных тестах - XCTAssertEqual vs == - PullRequest
0 голосов
/ 18 марта 2020

Я пытаюсь сравнить значения типа swift в моих модульных тестах и ​​заметил, что XCTAssertEqual не компилируется, тогда как сравнение с == компилируется нормально.

XCTAssertEqual(MyStruct.self, MyStruct.self) -> Не скомпилируется с ошибкой «Глобальная функция» XCTAssertEqual (: : _: file: line :) 'требует, чтобы MyStruct.Type соответствовал "Equatable '"

XCTAssertTrue(MyStruct.self == MyStruct.self) -> отлично компилируется

Я хотел бы понять, в чем разница между этими двумя сравнениями.

1 Ответ

3 голосов
/ 18 марта 2020

XCTAssertEqual требует, чтобы его аргументы соответствовали Equatable. MyStruct.Type - это мета-тип, который, как и все мета-типы, не соответствует Equatable, поэтому MyStruct.self нельзя использовать в качестве аргумента для XCTAssertEqual.

Однако == Оператор определен для всех мета-типов. Вот почему вы можете использовать == на них. Это «особый случай», реализованный здесь .

«Но не является ли == одним из требований требований Equatable?» Вы могли бы сказать. Да, но это не означает, что типы, которые реализуют ==, автоматически соответствуют Equatable. Обратное утверждение верно: каждый тип, соответствующий Equatable, должен реализовывать ==.

...