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