Swift 4.1 update:
With the introduction of conditional matching in Swift 4.1, Array now Equatable , so the problem should be solved without the need for any workarounds.
In addition, Swift now allows a type to automatically synthesize an Equatable match if all its members are Equatable by simply declaring Equatable match as part of the original type definition (rather than an extension), but without implementing any of its requirements. This works for enumerations, provided that the associated values, if any, are Equatable .
The code from this question can now be written much more briefly, as shown below:
import Foundation struct Post: Equatable { let text: String } enum Result<T>: Equatable where T: Equatable { case success(result: T) case error }
This code will pass all the tests indicated in the question:
func test() { // Test 1: Check Post type for equality: OK let post1 = Post(text: "post") let post2 = Post(text: "post") if post1 == post2 { print("equal posts") } // Test 2: Check [Post] type for equality: OK let arrayOfPosts1 = [post1, post2] let arrayOfPosts2 = [post1, post2] if arrayOfPosts1 == arrayOfPosts2 { print("equal arrays of post") } // Test 3: Check Result<Post> type for equality: OK let result1 = Result<Post>.success(result: post1) let result2 = Result<Post>.success(result: post2) if result1 == result2 { print("equal results of post") } // Test 4: Check Result<[Post]> type for equality: OK let arrayResult1: Result<[Post]> = Result<[Post]>.success(result: arrayOfPosts1) let arrayResult2: Result<[Post]> = Result<[Post]>.success(result: arrayOfPosts2) if arrayResult1 == arrayResult2 { print("equal results of array of posts") } }
Here is the result:
test() /* prints: equal posts equal arrays of post equal results of post equal results of array of posts */
source share