我一直在尝试使用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()
只能返回一个字符串,所以我会认为这是向下转换的完美情况。那么为什么编译器会给我一个警告呢?
import Foundation
,它甚至无法编译,因为String
不是一个类类型,也不兼容AnyObject
。如果你将最后一个String
改成NSString
,警告就会消失,这可能意味着你在as
中使用了非类类型的String
,导致了问题。 - newacctas
的功能已被删除,并被as!
所取代。因此,当您使用as!
时,您将会得到相同的错误(使用as
将不再生成此错误)。 - mfaani