ios – 如何在Swift中使用(?)和(!)

ios – 如何在Swift中使用(?)和(!),第1张

概述我是 swift的新手,我在理解如何使用(!)和(?)方面遇到了一些困难 据我所知,当存在变量可以为零的实例时,我们可以使用(?). 当你100%确定该项目不是零时使用(!). 1.工作正常 – 可选项 var john:String?john = "Is my name"println(john!) 2.运行时崩溃 – !一定不能为零 – 意味着这是正确的 var john:String? 我是 swift的新手,我在理解如何使用(!)和(?)方面遇到了一些困难

据我所知,当存在变量可以为零的实例时,我们可以使用(?).
当你100%确定该项目不是零时使用(!).

1.工作正常 – 可选项

var john:String?john = "Is my name"println(john!)

2.运行时崩溃 – !一定不能为零 – 意味着这是正确的

var john:String?println(john!)

3.工作正常

var dict: [String:AnyObject] = Dictionary()dict["name"] = "John"var str: String = dict["name"]! as String <--- Taking away the (!) says it's not convertible to String

4.无法运行/构建 – 对我而言,它类似于1.

var dict: [String:AnyObject]? = Dictionary() ---error says does not have a member named 'subscript'dict["name"] = "John"var str: String = dict["name"]! as String

5.在解开可选值时意外地发现了nil

var dict: [String:AnyObject] = Dictionary()dict["name"]? = "John"var str: String = dict["name"]! as String

如果有人可以帮我理解这些事情,那就太棒了.谢谢!

解决方法 这是一个有点误导性的解释,相信什么时候! ‘标记’然后100%不能为零.有可能.你只能这么说,你得到的价值已经解开了,所以你不需要强行再打开它 – 但它可以是零.

试试这个例子:

var text: String! = "hello"text = nil;println(text)

它为你打印一个零.

您的应用程序崩溃的原因是您强制解包一个nil的可选项,即无效的 *** 作数.

#4

逐行:

var dict: [String:AnyObject]? = Dictionary() // from OP

你的dict是可选的,让我们看看你在这里做了什么:

dict["name"] = "John" // from OPvar str: String = dict["name"]! as String // from OP

你有一个可选的词典,你想以某种方式使用它,你有两种可能的方法:

>(A)通过可选链接;
>(B)通过强行打开;

(一个)

dict?["name"] = "John" // optional chaining

它非常简单,如果字典不是nil,它会为键名指定新值,否则链会慷慨地落在运行时没有任何反应.

从这条线的角度来看:

var str: String = dict!["name"]! as String // forcibly unwrapped

如果字典或键的值为nil,则它会在运行时崩溃(根据第一段说明:强制解包nil的无效 *** 作数),但如果字典和键都执行有效对象,则str将为John.

(B)

dict!["name"] = "John" // forcibly unwrapped

它就像一个魅力,如果dict存在,则为键名指定新值;但是如果dict是nil,那么这是运行时终止点(也就是崩溃),因为nil不能被强行打开(见上文).

#5

逐行:

var dict: [String:AnyObject] = Dictionary() // from OP

你的dict不是可选的,甚至不是nil,但字典实际上是空的,所以它中没有密​​钥,包括名字.

dict["name"]? = "John" // from OPvar str: String = dict["name"]! as String // from OP

当链的任何元素掉落时,可选链接总是会下降 – 因此在您的代码中不会分配新值,但是优雅地发生了下降,因此您绕过了关于分配新值的第一行,但是应用程序崩溃了第二行,因为该值不存在,并且您尝试强制解包它(请参阅上面的无效 *** 作数).

因此,如果要为不存在的键分配新值,则需要从第一行删除可选链接:

dict["name"] = "John"

如果您不想通过添加新的键/值来更改原始字典,则可选链接很有用,但您只想覆盖现有字典:

dict["name"] = "John"dict["name"]? = "Jack"

在这种情况下,新值将是Jack,因为可选链接不会因为键名已经存在具有不同的值而下降,因此它可以被覆盖并且将被覆盖;但:

dict["name"] = nildict["name"]? = "Jack"

可选的链接将会下降,此处不会为该键分配新值.

注意:还有许多其他的事情和想法可以讲述这个概念.原始文档可在Apple网站的Swift Resources部分下找到.

总结

以上是内存溢出为你收集整理的ios – 如何在Swift中使用(?)和(!)全部内容,希望文章能够帮你解决ios – 如何在Swift中使用(?)和(!)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1077057.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-26
下一篇2022-05-26

发表评论

登录后才能评论

评论列表(0条)

    保存