[swift-evolution] Implementing a protocol with default implementations
Daniel Eggert
danieleggert at me.com
Thu Apr 14 06:01:25 CDT 2016
Optional protocols are implemented with
1> protocol P {
2. func bar()
3. }
4. extension P {
5. func bar() {
6. // do nothing
7. }
8. }
but all bets are off when I'm using this like so
9> struct S {}
10. extension S : P {
11. func baz() {
12. print("Hello")
13. }
14. }
15.
16. let s = S()
s: S = {}
17> s.bar()
18>
This will not print anything, and the compiler will not tell me that I misspelled "bar" as "baz".
It would be extremely helpful to have a keyboard along the lines of "this is supposed to implement something in a protocol" -- which would give a warning (error?) if it doesn't.
I know there've been some discussions this, but particularly with complex protocol methods (take a look at NSURLSessionDelegate and friends), this is extremely tricky to get right, and the compiler does nothing to help me as a developer.
Take a look at this signature
func urlSession(session: NSURLSession, task: NSURLSessionTask, didReceive challenge: NSURLAuthenticationChallenge, completionHandler: (NSURLSessionAuthChallengeDisposition, NSURLCredential?) -> Void)
If I mistype that as
func urlSession(NSURLSession, task: NSURLSessionTask, didReceive challenge: NSURLAuthenticationChallenge, completionHandler: (NSURLSessionAuthChallengeDisposition, NSURLCredential?) -> Void)
or
func urlSession(session: NSURLSession, task: NSURLSessionTask, didReceiveChallenge challenge: NSURLAuthenticationChallenge, completionHandler: (NSURLSessionAuthChallengeDisposition, NSURLCredential?) -> Void)
it's very painful to track down why things don't work -> developers will be sad.
/Daniel
More information about the swift-evolution
mailing list