> On 10 Nov 2016, at 16:53, Jay Abbott <[email protected]> wrote:
>
> Haravikk,
>
> I think you missed ilya’s point with the owner/pet example:
>
> // This is inside the Owner class...
> func freeMyPetIfIHaveOne {
> if pet != nil {
> pet.setFree() // this sets pet = nil
> // self.pet is now nil - not due to concurrency, it was set to nil on
> this thread in the function above.
> // However, the compiler considers it a non-optional at this point
> pet.doStuff() // Compiler allows, bad things happen!
> }
> }
> As Dennis mentioned, narrowing only works for immutable values, and since
> optionals are always mutable it defeats the whole justification for it. I
> like the concept, but maybe it should be for immutables only?
>
If pet is of type Optional<T> then a .setFree() method on T cannot set self =
nil, as self is of type T only in that scope.
The only way you can do something like that is to declare the setFree() method
on Optional where Element:T, but that won't work on the updated proposal which
uses a keyword to explicitly unwrap the variable (to avoid precisely that kind
of Optional<T> vs T method conflict), you can view the updated proposals here:
https://github.com/Haravikk/swift-evolution/blob/master/proposals/NNNN-optional-unwrapping.md
<https://github.com/Haravikk/swift-evolution/blob/master/proposals/NNNN-optional-unwrapping.md>
https://github.com/Haravikk/swift-evolution/blob/master/proposals/NNNN-type-narrowing.md
<https://github.com/Haravikk/swift-evolution/blob/master/proposals/NNNN-type-narrowing.md>
I've also checked and a similar case like this for polymorphic types shouldn't
be an issue either, as you can't assign self to a wider (or even orthogonal)
type.
In other words, the only way that .setFree() can make changes that would break
narrowing would be to have a reference to the instance you're working with,
which is what the proposals now guard against. But for value types this should
not be an issue at all.
This is all of course unless I'm missing something else, but I tried in a
playground and I can't assign anything to self that would break
narrowing/unwrapping that I can see, except through a reference type.
_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution