> On 22 Jun 2017, at 22:28, Mike Kluev via swift-evolution 
> <[email protected]> wrote:
> 
> On Wed, 21 Jun 2017 15:04:46 David Moore <mooredev at me.com 
> <http://me.com/>> wrote:
> 
> > This would be a bit counter-intutivie in my opinion, and it’s already 
> > possible 
> > with the language today. First of all, structs in Swift cannot be built 
> > upon. 
> > Rather, I believe the intention is to use protocols for such a task. That’s 
> > what 
> > the new Swift String and Substring structs do. The following code example 
> > demonstrates the intended behavior, without any additional language 
> > improvements.
> > 
> > protocol Foo {
> >     func a() -> Any?
> > }
> > 
> > extension Foo {
> >     func a() -> Any? {
> >         return nil
> >     }
> > }
> > 
> > struct ValueSemantics: Foo {}
> > 
> > class ReferenceSemantics: Foo {}
> 
> while you can use protocols, and protocol extensions specifically, to share 
> implementation there are two obvious problems with this "workaround":
> 
> 1) protocol extensions' based implementation is very limited as you have no 
> storage around. e.g. start with a normal struct method that accesses an 
> instant variable and try to refactor it into a protocol extension... in other 
> words try doing anything useful other than "return nil" above, anything that 
> requires instance variable access. you'll have to be creative in your 
> protocol implementation, e.g. have a "var storage { get set }" as part of the 
> protocol and implement that "var storage" inside your struct (and class), and 
> in case of "struct" it would be strange as the struct itself is (already) the 
> storage, so you would introduce another level of indirection for no good 
> reason other than to satisfy this workaround, which is not nice to begin with 
> and has to be thought upfront (see below)

Not sure what you mean by added indirection here, the following seems perfectly 
straightforward to me:

        protocol Foo {
                var someValue:Int { get set }
                func a() -> Any?
        }

        extension Foo {
                func a() -> Any? { return self.someValue }
        }

        struct ValueSemantics:Foo { var someValue:Int }
        class ReferenceSemantics:Foo {
                var someValue:Int { return nil }
        }

There is no added access overhead here, the only difference is that the 
protocol itself leaves it up to implementations whether someValue is stored or 
computed.

> 2) the proposed method works with value types that are already available 
> (e.g. the OS structs or third party ones) - something you can not change but 
> still want to wrap into a reference type.

This sounds to me more like delegation support that's required, which is 
something that I would like to see for reducing boilerplate. But I'd prefer to 
see something like:

        struct Foo:SomeProtocol { var someValue:Int }
        class Bar:SomeProtocol, SomeOtherProtocol {
                var foo:Foo implements SomeProtocol, 
SomeOtherProtocol.someMethod
                        // Implements all of SomeProtocol, some of 
SomeOtherProtocol
        }

Note that's not a specific proposal for syntax, the important point here is 
that I'm explicitly linking my stored property foo to implementation of a 
protocol, telling the compiler to automatically use foo's properties/methods to 
conform to SomeProtocol by default (but leaving me free to customise).

I don't think that masking the behaviour behind something that looks like 
extension is a good idea, for this reason I prefer explicit delegation. But 
like I say, I'm not 100% on my preferred syntax for it, I just think it should 
be its own, distinct feature rather than potentially fooling people into 
thinking they're extending a struct.
_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to