迅速 – 以强制下线作为选择,不会产生“零”
我一直在玩Swift,发现当下载一个要插入字典的对象时,我会发现一个奇怪的警告:将强制下线处理为“String”作为可选项将永远不会产生“nil”。如果我用“as”替换“as”那么警告就消失了。
func test() -> AnyObject! { return "Hi!" } var dict = Dictionary<String,String>() dict["test"]=test() as String' 苹果的文档说如下
我不清楚为什么要使用“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。行为是一样的。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |