可选链接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应该是非法的. 有人能帮我理解这个事情吗?
当你说:
我会说你几乎在那里. 这不是所有的属性都是可选的,原来的调用是可选的,所以看起来像其他的属性是可选的. 字符不是可选属性,也不是count,但是您调用它的值是可选的.如果有值,则字符和计数属性将返回一个值;否则返回nil.这是因为s?.characters.count的结果返回一个Int? 如果任一属性是可选的,那么您需要添加?但是,在你的情况下,他们不是.所以你不要 编辑以下评论 从评论:
我会尝试在这里回答,在那里比在评论领域有更多的空间: 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) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |