我一直在和Swift 玩,发现当向下投射一个要插入字典的对象时,我会得到一个奇怪的警告:Treating a forced downcast to 'String' as optional will never produce 'nil'
.如果我把as
换成as?
,警告就会消失.
func test() -> AnyObject! {
return "Hi!"
}
var dict = Dictionary<String,String>()
dict["test"]=test() as String
苹果的文件中说:
因为向下转换可能会失败,所以类型转换操作符有两种不同的形式.可选表单
as?
返回一个可选值,该值是您试图向下转换到的类型.强制形式as
try 向下投射,并将结果作为单个复合动作展开.
我不清楚为什么这里用as?
而不是as
是正确的.一些测试显示,如果我将test()更改为返回一个Int而不是字符串,那么如果我继续使用as
,代码将因错误而退出.如果我切换到使用as?
,那么代码将继续正常执行,并跳过该语句(dict将保持为空).然而,我不确定这为什么更可取.在我看来,我宁愿程序错误退出,让我知道演员阵容不成功,然后干脆忽略错误语句并继续执行.
根据文档,我应该使用强制形式"只有当你确信沮丧总是会成功的时候"在这种情况下,我确信向下投射总是会成功的,因为我知道test()
只能返回一个字符串,所以我认为这是强制向下投射的完美情况.那么为什么编译器会给我一个警告呢?