Abstract methods

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.