From Apple Developer Resources
Not every type in Swift can be compared with an equal operator (==). For example, if you create your own class or structure to represent a complex data model, then the equal value for this class or structure is not what Swift can guess for you. Because of this, it is not possible to guarantee that this code will work for every possible type T, and a corresponding error is reported when trying to compile the code.
However, all is not lost. The Swift standard library defines a protocol called Equatable, which requires any appropriate type to implement equal to the operator (==) and not equal to the operator (! =) To compare any two values โโof this type. All Standard Swifts types automatically support the Equatable protocol.Any type that is Equatable can be safely used with the findIndex function, as it is guaranteed to be maintained equal to the operator. To express this fact, you write an Equatable type constraint as part of the definition of type parameters when defining a function:
func findIndex<T: Equatable>(array: T[], valueToFind: T) -> Int? { for (index, value) in enumerate(array) { if value == valueToFind { return index } } return nil }
Here is an example from their documentation explaining how to override ==
struct MyStruct: Equatable { var name = "Untitled" } func == (lhs: MyStruct, rhs: MyStruct) -> Bool { return lhs.name == rhs.name } let value1 = MyStruct() var value2 = MyStruct() let firstCheck = value1 == value2 // firstCheck is true value2.name = "A New Name" let secondCheck = value1 == value2 // secondCheck is false
In your case, you would do
class MyObj{ var id = 3 var name: String? } func == (lhs: MyObj, rhs: MyObj) -> Bool { return lhs.id == rhs.id }
source share