I have a question in swift extension:
protocol Racer {
var speed: Double { get }
}
extension Sequence where Iterator.Element == Racer {
func fastest() -> Iterator.Element? {
return self.max(by: { (a: Iterator.Element, b: Iterator.Element) -> Bool in
return a.speed < b.speed
})
}
}
extension Sequence where Iterator.Element: Racer {
func bla() -> Void {
}
}
I am wondering what's the difference between them. In fact, an array of type [Racer] doesn't have bla() function.
Edit 1: There's still a question, assuming we have a struct conform to Racer
struct Human: Racer {
var speed: Double
}
If we have an Array<Racer>:
let me = Human(speed: 99999)
let you = Human(speed: 99998)
let arr: [Racer] = [me, you]
// Threre's no problem, we can do this
arr.fastest()
// but
let arr2: [Human] = [me, you]
// this Array won't have the `fastest` function
arr2.fastest() ------> Error!
So, I have to extension both == and : at the same time for the same function?
When using : you are writing an extension for a type that conforms to a particular protocol or inherits a specified class.
When using = you are writing an extension for a specific type, in your case Racer.
You can read more in the docs here.
Edit:
One difference is that when you are using = the type must match, this means that the element type for the array must be Racer.
This is why Array[Human] doesn't get the extension method, because the type isn't Racer is actually Human.
You don't need 2 methods, you can change the first one to use : instead of =. Conforming to Racer protocol is enough, it doesn't need to be of Racer type.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With