IMO the most problematic Self becomes in a generic context, i.e.:

(pseudo code below)

protocol Monad {
associatedtype A

func flatMap<B>(f:(A)->Monad<B>) -> ErasedSelf<B>
}

I would really like to have this ErasedSelf.

On Sun, 8 Jan 2017 at 5:21 Xiaodi Wu via swift-evolution <
swift-evolution@swift.org> wrote:

> On Sat, Jan 7, 2017 at 5:33 PM, Braeden Profile <jhaezhy...@gmail.com>
> wrote:
>
>
> Of course, I would love being able to use an initializer setup, but there
> are serious bugs in the implementation.
>
> protocol Clonable
> {
>       init(other: Self)
> }
>
> extension Clonable
> {
>       func clone() -> Self
>               { return type(of: self).init(other: self) }
> }
>
>
> class Base: Clonable
> {
>       var x: Int
>       
>       init(x: Int)
>               { self.x = x }
>       
>       required init(other: Base)
>               { self.x = other.x }
> }
>
> class Derived: Base
> {
>       var y: String
>       
>       init(x: Int, y: String)
>       {
>               self.y = y
>               super.init(x: x)
>       }
>       
>       // Should be required by the Clonable protocol, but it isn't.
>       required init(other: Derived)
>       {
>               self.y = other.y
>               super.init(other: other)
>       }
>       
>       // Required because it was `required` in Base.  Even a `Derived` calls 
> this initializer to clone, which is wrong.  Bugs abound.
>       required init(other: Base)
>               { fatalError("init(other:) is wrong.") }
> }
>
>
>
> let me = Derived(x: 1, y: "food")
> let alienClone = me.clone() // "init(other:) is wrong."
>
>
> Agree. That seems wrong. Great example.
>
>
> So, is this odd behavior intentional, a bug, or a design deficiency?  I
> would think that when a protocol has a method or initializer has `Self`
> parameters—like in Clonable—every subclass would be required to implement
> its own specialized version (much like a required initializer).  That would
> be a special case of the protocol system, though.
>
> As it sits, even fixing the calling behavior of my example leaves us with
> the problem of subclasses inheriting inapplicable required initializers
> from superclasses that actually don’t make any sense.
>
> Does this deserve its own thread?
>
>
> Dunno, maybe best to have its own thread. It's not mentioned as part of
> SE-0068, but IMO a complete design that respects the spirit of that
> proposal *should* involve allowing you to write:
>
> ```
> class Base : Clonable {
>   required init(other: Self) { ... }
> }
>
> class Derived : Base {
>   required init(other: Self) { ... }
> }
> ```
>
>
>
>
> _______________________________________________
>
> swift-evolution mailing list
>
> swift-evolution@swift.org
>
> https://lists.swift.org/mailman/listinfo/swift-evolution
>
>
_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to