迅速 – 以强制下线作为选择,不会产生“零”

前端之家收集整理的这篇文章主要介绍了迅速 – 以强制下线作为选择,不会产生“零”前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我一直在玩Swift,发现当下载一个要插入字典的对象时,我会发现一个奇怪的警告:将强制下线处理为“String”作为可选项将永远不会产生“nil”。如果我用“as”替换“as”那么警告就消失了。
func test() -> AnyObject! {
  return "Hi!"
}

var dict = Dictionary<String,String>()
dict["test"]=test() as String'

苹果的文档说如下

Because downcasting can fail,the type cast operator comes in two different forms. The optional form,as?,returns an optional value of the type you are trying to downcast to. The forced form,as,attempts the downcast and force-unwraps the result as a single compound action.

我不清楚为什么要使用“as?”而不是“as”在这里是正确的。一些测试显示,如果我更改test()返回一个Int而不是一个String,如果我继续使用“as”,代码退出一个错误。如果我切换到使用“as?”那么代码将继续正常执行并跳过该语句(dict将保持为空)。但是,我不知道为什么这更可取。在我看来,我宁愿程序退出一个错误,让我知道,演员失败,然后只是忽略错误的声明并继续执行。

根据文件,我应该使用强制形式“只有当你确定downcast将永远成功”。在这种情况下,我肯定downcast将永远成功,因为我知道test()只能返回一个String,所以我认为这是一个完美的情况,强制形式的下来铸造。那么为什么编译器给我一个警告?

我们来仔细看一下你的最后一行,并将其爆炸,看看发生了什么:
let temporaryAnyObject = test()
let temporaryString = temporaryAnyObject as String
dict["test"] = temporaryString

错误在第二行,在这里您告诉编译器强制该temporaryAnyObject绝对是一个String。代码仍将编译(假设您不将警告视为错误),但是如果temporaryAnyObject实际上不是String,则会崩溃。

“as”的作用方式,没有“?”,基本上是说“从现在开始,把这个表达式的结果视为那个类型,如果结果实际上是这种类型,否则我们变得不一致,不能再运行。

方式“as?”正在说“从现在开始,把这个表达式的结果视为那个类型IF,结果实际上是那种类型的,否则这个表达式的结果是nil”。

所以在我上面的分解示例中,如果test()返回一个String,那么“as”downcast会成功,而temporaryString现在是一个String。如果test()不返回一个String,而是说一个Int或者其他任何没有从String子类化的东西,那么“as”就会失败,代码就不能继续运行了。

这是因为,作为完全控制的开发人员,您告诉系统以这种方式行事,不要放置可选的“?”指示符。 “as”命令具体意味着您不能容忍可选行为,并且您需要该downcast才能正常工作。

如果你放了“?”,那么temporaryString将为零,第三行将简单地从字典中删除“test”键/值对。

这可能看起来很奇怪,但这只是因为这是许多语言的相反的默认行为,如Obj-C,默认情况下将所有内容视为可选的,并且依赖于您自己的检查和断言。

编辑 – Swift 2更新在Swift 2下,强制,可用的downcast操作符“as”已被删除,并被替换为“as!”,这是Swiftier。行为是一样的。

猜你在找的Swift相关文章