[swift-evolution] Replace the override keyword by 'extend' and 'replace' or add an annotation like @SuppressSuperCall

Florian Liefers florian at liefers.com
Mon Feb 15 14:57:46 CST 2016


Hi!

I would like to suggest to replace the override keyword for functions by something like extend and replace or to add an annotation like @SuppressSuperCall (don’t know a good name for it).
The reason for this is, that it might happen, that one forgets to call the super’s implementation in an overridden function or if one reads the code it might not be obvious why the super’s implementation is not called:

class View {
   func viewDidLoad() {
      // does something
   }
}

class Button: View {
  override func viewDidLoad() {
      super.viewDidLoad()   // <— this might be forgotten
      // do something other
   }
}

The compiler will accept if one overrides a superclass’s function but does not call the superclass’s implementation which is often ok. The developer should clearly state that he doesn’t want to call the superclass’s implementation, otherwise the compiler should throw an error.

// Example for extending a function
class Button: View {
  extend func viewDidLoad() {
      super.viewDidLoad()
      // do something
   }

  extend func viewDidAppear() {
      // do something
   } // <— the compiler should throw an error here.
}

// Example for replacing a function
class Geometry {
   func volume() -> Double {
      return 0;
   }
}

class Cube: Geometry {
   var length: Double = 0.0
   replace func volume() -> Double {
      let v = length * length * length
      return v
   }
}

Cheers,
Florian


More information about the swift-evolution mailing list