
据我所知,当存在变量可以为零的实例时,我们可以使用(?).
当你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中使用(?)和(!)所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)