var s: String?
s可能包含nil,或者包含在可选中的String.所以,我尝试了这个长度:
let count = s?.characters?.count ?? 0
但是,编译器希望这样做:
let count = s?.characters.count ?? 0
我对可选链接的理解是,一旦你开始使用?在虚线表达式中,其余的属性是可选的,通常由?访问?
所以,我进一步挖了一下,在操场上试过:
var s: String? = "Foo" print(s?.characters) // Output: Optional(Swift.String.CharacterView(_core: Swift._StringCore(_baseAddress: 0x00000001145e893f,_countAndFlags: 3,_owner: nil)))
结果表明s?.characters确实是一个可选实例,表明s?.characters.count应该是非法的.
有人能帮我理解这个事情吗?
My understanding of optional chaining is that,once you start using
?.
in a dotted expression,the rest of the properties are made optional and are typically accessed by?.
,not.
.
我会说你几乎在那里.
这不是所有的属性都是可选的,原来的调用是可选的,所以看起来像其他的属性是可选的.
字符不是可选属性,也不是count,但是您调用它的值是可选的.如果有值,则字符和计数属性将返回一个值;否则返回nil.这是因为s?.characters.count的结果返回一个Int?
如果任一属性是可选的,那么您需要添加?但是,在你的情况下,他们不是.所以你不要
编辑以下评论
从评论:
I still find it strange that both
s?.characters.count
and(s?.characters)?.count
compile,but(s?.characters).count
doesn’t. Why is there a difference between the first and the last expression?
我会尝试在这里回答,在那里比在评论领域有更多的空间:
s?.characters.count
如果s为零,整个表达式返回nil,否则为int.那么返回类型是Int?
(s?.characters).count // Won’t compile
打破这个:如果s是零,那么(s?.characters)是零,所以我们不能打电话给它.
为了调用(s?.characters)的count属性,表达式需要可选地解包,即写为:
(s?.characters)?.count
编辑进一步添加
最好我可以解释一下这是一些操场代码:
let s: String? = "hello" s?.characters.count (s?.characters)?.count (s)?.characters.count ((s)?.characters)?.count // s?.characters.count func method1(s: String?) -> Int? { guard let s = s else { return nil } return s.characters.count } // (s?.characters).count func method2(s: String?) -> Int? { guard let c = s?.characters else { return nil } return c.count } method1(s) method2(s)