[swift-evolution] [Review] SE-0026 Abstract classes and methods
    Andrey Tarantsov 
    andrey at tarantsov.com
       
    Tue Mar 29 03:54:56 CDT 2016
    
    
  
> This should be resolved when PwS  <http://article.gmane.org/gmane.comp.lang.swift.evolution/3082>(Protocol with Storage) get alive:
> 
>   // Framework land
>         public protocol DatabaseRecord {
>       internal extension DatabaseRecord {
>                 var referenceRow: DatabaseRow
>        public  extension DatabaseRecord {
Yay for visibility and storage in protocols, and generally for being able to provide a different API to the implementers of the protocol compared to the clients of the protocol.
But.
> So explain to me: if this code worked:
> 
> 	protocol ActivityViewControlling: UIViewController {
> 		func retrieveText() -> String
> 	}
> 	extension ActivityViewControlling {
> 		@IBOutlet var messageLabel: UILabel!
> 		
> 		override func viewWillAppear(animated: Bool) {
> 			super.viewWillAppear(animated)
> 			messageLabel.text = retrieveText()
> 		}
> 	}
> 
> What would you feel was missing compared to this?
> 
> 	abstract class ActivityViewController: UIViewController {
> 		abstract func retrieveText() -> String
> 		
> 		@IBOutlet var messageLabel: UILabel!
> 		
> 		override func viewWillAppear(animated: Bool) {
> 			super.viewWillAppear(animated)
> 			messageLabel.text = retrieveText()
> 		}
> 	}
For all intents and purposes, you made an abstract class here, but calling it a protocol. 
It has advantages:
+ you can achieve multiple inheritance that way
+ ... hm? what else?
and disadvantages:
+ it's still, for all intents and purposes, an abstract class, but for some reason you're now calling it a protocol — THAT'S confusing, if you ask me;  now there's two kinds of protocols, the normal ones and the ones that do magic stuff when you implement them (I personally think those latter thingies should be called mixins)
+ it has additional limitations (I don't think you can call super, which is often very useful)
+ it's a concept that doesn't work or exist, and there's no telling if it'll be a part of Swift 3 or not
I believe we're confusing conceptual and implementation details here. Conceptually, both approaches seem to be using two different names for the same thing; I don't really care if the functionality I need comes through a supercharged protocol or a slightly enhanced class.
Are we really discussing anything more than a name? If yes, what is it?
Implementation-wise, the compiler can always translate abstract classes into protocols internally, so I don't really see the implementation difference as important.
A.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20160329/1448646b/attachment.html>
    
    
More information about the swift-evolution
mailing list