可选链接Swift字符串

前端之家收集整理的这篇文章主要介绍了可选链接Swift字符串前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
使用可选链接,如果我有一个 Swift变量
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)

猜你在找的Swift相关文章