This is definitely something I’m hoping to see as well, alongside more intelligent handling of the is keyword, as currently Swift doesn’t handle the following either:
if foo is SomeType { /* foo could be safely used as SomeType here, but currently is not */ } Hopefully someone more familiar can weigh in, as it seems like something I expect to be on the way but perhaps has been delayed in case any further changes to the type system were required? > On 29 Apr 2016, at 15:37, Tod Cunningham via swift-evolution > <swift-evolution@swift.org> wrote: > > I'm new to the swift evolution community, but I wanted to toss an idea out > there to get some feedback on it. So here it goes... > > Currently, if you assign a non-nil value to an optional and then want to > access that optional later, in the same context, you need to manually unwrap > the value. This is usually done either by using "!" or by using something > like "if let" or guard. > > What would it be like if the compiler could auto unwrap, in cases where in > knows the optional will have some value? This would make the code "clean" > and still be safe. > > This concept of Auto Unwrapping of Optionals is similar to Implicitly > Unwrapped Optionals, but is only applied when the compiler knows it is safe > to do so. > > Take the following example: > > class Test { > var today: NSDate? = nil > func test() { > today = today ?? NSDate() > print("Today is \(today)") // Would be printed as an optional > let timeInterval: NSTimeInterval = today!.timeIntervalSinceNow // > Requires ! or (if let) to unwrap > // ... do stuff with timeInterval ... > } > } > > With the above example, the compiler could known that today has a value after > it's set in the test method. So why couldn't the compiler auto unwrap it > when accessed? This would mean manual unwrapping would be unnecessary: > > class Test { > var today: NSDate? = nil > func test() { > today = today ?? NSDate() > print("Today is \(today)") // Would be printed as a value (not an > optional) > let timeInterval: NSTimeInterval = today.timeIntervalSinceNow // No ! > required (auto unwrapped) > // ... do stuff with timeInterval ... > } > } > > If the value later gets set to an optional value, then it will no longer be > auto unwrapable : > > class Test { > var today: NSDate? = nil > > func optionalDay() -> NSDate? { > return NSDate() > } > > func test() { > today = today ?? NSDate() > print("Today is \(today)") // Would be printed as a value (not an > optional) > let timeInterval: NSTimeInterval = today.timeIntervalSinceNow // No > ! required (auto unwrapped) > let timeInterval2: NSTimeInterval = today!.timeIntervalSinceNow // > Explicit unwrapping would still be allowed > > // If today is assigned an optional value, we can no longer auto > unwrap it > today = optionalDay() > print("Today is \(today)") // Would be printed as an optional > let timeInterval3: NSTimeInterval = today!.timeIntervalSinceNow // > manual unwrapping would be required > } > } > > Note in the above example, explicit unwrapping would still be allow. The > variable is still an optional. This allows for existing code to remain > unchanged. > > This change would encourage less use of forced unwrapping "!", generally > require the developer to write less code, and would maintain code safety. On > the down side, it is performing some compiler “magic”. It would be yet > another thing to explain when trying to introduce people to swift and > especially optionals. > > What do you all think, would something like this be worth pursuing, what > other pluses or minus would this introduce, has something like this already > been discussed? > > Thanks, > Tod Cunningham > > _______________________________________________ > 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