加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

可选链接Swift字符串

发布时间:2020-12-14 05:36:40 所属栏目:百科 来源:网络整理
导读:使用可选链接,如果我有一个 Swift变量 var s: String? s可能包含nil,或者包含在可选中的String.所以,我尝试了这个长度: let count = s?.characters?.count ?? 0 但是,编译器希望这样做: let count = s?.characters.count ?? 0 我对可选链接的理解是,一旦你
使用可选链接,如果我有一个 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)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读