Home > Back-end >  How to make a constrained extension of Collection generic in Swift?
How to make a constrained extension of Collection generic in Swift?

Time:12-17

Context

I have a class Profile which conforms to protocol Entity. I am also adding a search method to all Swift Collections where the Element is a Profile.

However, I would like to make this generic to support not only Profile but every object conforming to Entity.


Code

protocol Entity {
    var name: String { get }
}

class Profile: Entity { ... }

extension Collection where Element == Profile {
    func searched(with search: String) -> [Profile] {
        guard !(search.isEmpty) else { return self }
        return self.filter { ($0.name.lowercased().contains(search.lowercased())) }
    }
}

Question

How can I make the search method generic to support all objects conforming to Entity?

CodePudding user response:

first, you should change the extension to the below code

extension Collection where Iterator.Element: Entity

next, change the return type of the method to

func searched(with search: String) -> [Iterator.Element]

Finally, the extension can be like this:

extension Collection where Iterator.Element: Entity {
        func searched(with search: String) -> [Iterator.Element] {
            guard !(search.isEmpty) else { return [Iterator.Element]() }
            return self.filter { ($0.name.lowercased().contains(search.lowercased())) }
        }
}
  • Related