Yes, parenthesized expressions are primary expressions, which in turn
are all postfix expressions as specified by the first grammar rule for
postfix expressions and also the note you mentioned. I do think that
swiftc's behavior is the most intuitive. I just think the spec needs
to be clarified in that regard, that's all.

Cheers,
Ingo

On Mon, Aug 1, 2016 at 9:24 PM, Stephen Schaub <ssch...@gmail.com> wrote:
> Ingo,
>
> Thanks for pointing me to the specification. The example given in that
> section is helpful.
>
> You make a good point about what constitutes "the outermost expression."
> Parenthesized expressions, according to the spec, are primary expressions,
> not postfix expressions, but the spec also states that "Syntactically, every
> primary expression is also a postfix expression." So, either I'm not
> understanding the spec correctly, or the compiler is handling this case
> differently for some reason.
>
> Stephen
>
>
>
>
> On Mon, Aug 1, 2016 at 3:05 PM, Ingo Maier <ing...@gmail.com> wrote:
>>
>> If you are looking for the actual rules, they are defined in the
>> language reference, in the section on optional chaining expressions
>> [1]. It states that if you have an optional chaining expression of the
>> form `expression?` then
>>
>> "If the value of the optional-chaining expression is nil, all of the
>> other operations in the postfix expression are ignored and the entire
>> postfix expression evaluates to nil. If the value of the
>> optional-chaining expression is not nil, the value of the
>> optional-chaining expression is unwrapped and used to evaluate the
>> rest of the postfix expression. [...]. If a postfix expression that
>> contains an optional-chaining expression is nested inside other
>> postfix expressions, only the outermost expression returns an optional
>> type."
>>
>> However, it seems to me that this is not quite a correct description
>> of what swiftc does. Note the last sentence in particular. According
>> to the grammar, given a postfix expression <e> and two identifiers x
>> and y, the following are both postfix expressions:
>>
>> <e>?.x.y
>> (<e>?.x).y
>>
>> Without further specification, I would consider "the outermost
>> expression" to be `(<e>?.x).y` for the last case, when swiftc clearly
>> stops at parentheses. The spec should distinguish between
>> parenthesized-expressions and other postfix expressions or am I
>> missing that part?
>>
>> [1]
>> https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Expressions.html#//apple_ref/swift/grammar/optional-chaining-expression
>>
>> On Mon, Aug 1, 2016 at 8:17 PM, Stephen Schaub via swift-users
>> <swift-users@swift.org> wrote:
>> > I understand that the String.characters property is not optional.
>> > However, I
>> > am puzzled as to why
>> >
>> > s?.characters.count
>> >
>> > is legal, but
>> >
>> > (s?.characters).count
>> >
>> > is not. This seems counterintuitive. Can someone explain the logic or
>> > rules
>> > being used here?
>> >
>> > Stephen
>> >
>> >
>> >
>> >
>> > On Mon, Aug 1, 2016 at 2:09 PM, Saagar Jha <saa...@saagarjha.com> wrote:
>> >>
>> >>
>> >> Saagar Jha
>> >>
>> >> This isn’t quite how optional chaining in Swift works; see the Swift
>> >> Programming Guide, specifically “Linking Multiple Levels of Chaining".
>> >> Basically, `s?.characters.count` works because `s.characters` isn’t
>> >> Optional. You only use ? on properties that are Optional.
>> >>
>> >> On Aug 1, 2016, at 10:26, Stephen Schaub via swift-users
>> >> <swift-users@swift.org> wrote:
>> >>
>> >> With optional chaining, if I have a Swift variable
>> >>
>> >>     var s: String?
>> >>
>> >> s might contain nil, or a String wrapped in an Optional. So, I tried
>> >> this
>> >> to get its length:
>> >>
>> >>     let count = s?.characters?.count ?? 0
>> >>
>> >> However, the compiler wants this:
>> >>
>> >>     let count = s?.characters.count ?? 0
>> >>
>> >> or this:
>> >>
>> >>     let count = (s?.characters)?.count ?? 0
>> >>
>> >> My understanding of optional chaining is that, once you start using
>> >> '?.'
>> >> in a dotted expression, the rest of the properties evaluate as optional
>> >> and
>> >> are typically accessed by '?.', not '.'.
>> >>
>> >> So, I dug a little further and tried this in the playground:
>> >>
>> >> var s: String? = "Foo"
>> >> print(s?.characters)
>> >>
>> >> The result indicates that s?.characters is indeed an Optional instance,
>> >> indicating that s?.characters.count should be illegal.
>> >>
>> >> Why is s?.characters.count a legal expression?
>> >>
>> >>
>> >> --
>> >> Stephen Schaub
>> >> _______________________________________________
>> >> swift-users mailing list
>> >> swift-users@swift.org
>> >> https://lists.swift.org/mailman/listinfo/swift-users
>> >>
>> >>
>> >
>> >
>> >
>> > --
>> > Stephen Schaub
>> >
>> > _______________________________________________
>> > swift-users mailing list
>> > swift-users@swift.org
>> > https://lists.swift.org/mailman/listinfo/swift-users
>> >
>
>
>
>
> --
> Stephen Schaub
_______________________________________________
swift-users mailing list
swift-users@swift.org
https://lists.swift.org/mailman/listinfo/swift-users

Reply via email to