[swift-users] try? works on non-method-call?
Nicholas Outram
nicholas.outram at icloud.com
Thu Jul 21 03:03:40 CDT 2016
Are we saying this function
func couldFailButWillNot() throws -> Any {
return 42
}
has an implicit Int return type?
If so, there is actually no need for as? (which will result in an Optional - which I thought that was the behaviour in Swift 2 as well?)
> On 21 Jul 2016, at 08:59, Nicholas Outram via swift-users <swift-users at swift.org> wrote:
>
> The issue is related to the as?
>
> Try this:
>
> if let a = try? couldFailButWillNot() {
> print(a)
> }
>
>
> Nick
>
>> On 21 Jul 2016, at 07:13, Sikhapol Saijit via swift-users <swift-users at swift.org <mailto:swift-users at swift.org>> wrote:
>>
>> Hi Swift Community,
>>
>>
>> Yesterday I tried this code:
>>
>> ```
>> func couldFailButWillNot() throws -> Any {
>> return 42
>> }
>>
>> if let a = try? couldFailButWillNot() as? Int {
>> print(a)
>> }
>> ```
>>
>> And was surprised that the output was "Optional(42)” on both Swift 2.2 and Swift 3.
>> I always have the impression that when a variable is resolved with `if let` it will never be optional.
>>
>> So, with a little investigation, I found out that it happens because `as?` has higher precedence than `try?` and is evaluated first.
>> And the whole expression `try? couldFailButWillNot() as? Int` evaluated as “Optional(Optional(42))”.
>>
>> Also, I’m surprised that `try?` can be used with non-method-call.
>> This code: `print(try? 42)` will print “Optional(42)”.
>>
>> So, the questions are:
>>
>> 1. Is it intentional that `try?` can be used with non-method-call and return an optional of the type that follows?
>>
>> 2. Should we design `try?` to have higher precedence than `as?`.
>> My intuition tells me that
>> `let a = try? couldFailButWillNot() as? Int`
>> and
>> `let a = (try? couldFailButWillNot()) as? Int`
>> should be equivalent.
>>
>> 3. Do you think that doubly-nested optional (or multi-level-nested optional) is confusing and should be removed from Swift? (Yes, I’ve seen this blog post [Optionals Case Study: valuesForKeys](https://developer.apple.com/swift/blog/?id=12 <https://developer.apple.com/swift/blog/?id=12>))
>> For me “Optional(nil)” (aka “Optional.Some(Optional.None))”) doesn’t make any sense at all.
>> Maybe, one of the solution is to always have optional of optional merged into a single level optional? Like Optional(Optional(Optional(42))) should be the merged to Optional(42).
>>
>>
>> Thank you
>> Sikhapol Saijit (Sam)
>> iOS Developer, Taskworld, Bangkok
>> _______________________________________________
>> swift-users mailing list
>> swift-users at swift.org <mailto:swift-users at swift.org>
>> https://lists.swift.org/mailman/listinfo/swift-users
>
> _______________________________________________
> swift-users mailing list
> swift-users at swift.org
> https://lists.swift.org/mailman/listinfo/swift-users
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-users/attachments/20160721/495a683a/attachment.html>
More information about the swift-users
mailing list