On 22.04.2016 14:02, Joanna Carter wrote:
> As much as I detested the 'with' construct in Delphi, with all its accompanying opportunities for errors of scope, if you really think it a good idea, then you need to consider the possibility of those who want to 'with' more than one target. In which case, the use of $0, $1, etc would seem logical, although not necessarily very readable.
>
> Joanna
>
> --
> Joanna Carter
> Carter Consulting
>
> (de mon iPhone)
>

Actually we can "manually" now implement the very clean and handy "with" (including with more than 1 "target") like this:

(I propose to include such kind of "with" feature to language or to standard classes/protocols to be able to use it out-of-box for any class/structure, not for some we have to apply manually)

class A {
    var x = 0
    var y = 0
    var z = 0

    func with(block: (this: A)->()) -> Self {
        block(this: self)

        return self
    }

    func with<T>(another: T, block: (this: A, that: T)->()) -> Self {
        block(this: self, that: another)

        return self
    }
}

var myFirstVeryLongInstanceName = A().with {
    $0.x = 1
    $0.y = 2
    $0.z = 3
}

var mySecondVeryLongInstanceName = A().with {new in
    new.x = 11
    new.y = 12
    new.z = 13
}

myFirstVeryLongInstanceName.with {my in
    my.x *= 1
    my.y *= 2
    my.z *= 3
}

mySecondVeryLongInstanceName.with(myFirstVeryLongInstanceName) {to, from in
    to.x = from.x * 10
    to.y = from.y * 20
    to.z = from.z * 30

    print(from.x)
    print(to.x)
}

mySecondVeryLongInstanceName.with(myFirstVeryLongInstanceName) {
    $0.x = $1.x * 100
    $0.y = $1.y * 200
    $0.z = $1.z * 300

    print($1.x)
    print($0.x)
}



_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to