to me protocol extensions are both cool and evil. cool as you can add code.
evil because it's more natural to add another declarations in those
extensions rather than implementation:

protocol Foo {
   func foo()
}

extension Foo {
  func bar() //*** natural assumption is that i can do this. but i can't
}

While this can indeed be a common mistake, it feels much less natural to do that once you think about what protocol conformances mean and what it would take to make it possible IMO.