我一直在玩 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
尝试向下转换并将结果强制展开为单个复合动作。
我不清楚为什么在这里使用as?
而不是as
正确的。一些测试表明,如果我将 test() 更改为返回 Int 而不是 String,如果我继续使用as
. 如果我切换到使用,as?
那么代码将继续正常执行并跳过该语句(dict 将保持为空)。但是,我不确定为什么这是可取的。在我看来,我宁愿程序因错误而退出并让我知道强制转换不成功,然后简单地忽略错误语句并继续执行。
根据文档,我应该使用强制形式“只有当你确定向下转换总是会成功时”。在这种情况下,我确信向下转换总是会成功,因为我知道test()
只能返回一个字符串,所以我认为这是强制向下转换形式的完美情况。那么为什么编译器会给我一个警告呢?