Swift AnyObject转换

Cod*_*256 3 types downcast optional swift anyobject

我创建了一些测试代码来显示我遇到的问题.

这在操场上编译很好,但是,当我尝试将它放入项目时,Xcode会给出以下警告:Treating a forced downcast to 'String' as optional will never produce 'nil'第30行.我有两个建议来解决这个问题:

  1. Use 'as?' to perform a conditional downcast to 'String',这绝对没有意义.但是,它确实编译时没有警告/错误,这看起来很奇怪,因为它将可选值分配给非可选类型String.

    当您不确定向下转换是否成功时,请使用类型转换运算符的条件形式(作为?).这种形式的运算符将始终返回一个可选值,如果无法进行向下转换,则该值将为nil.这使您可以检查成功的向下转发.

    来自Swift语言指南.

    除非它认为我可能想要分配nil转换失败(因此删除字典条目),这没有任何意义.特别是因为我确信它会成功,因为我确实只是检查它是否是一个String.

  2. Add parentheses around the cast to silence this warning,这似乎毫无意义,但确实使警告沉默.这似乎是一件奇怪的事情,但话说回来,这可能只是一种确认你真的想要做你想做的事情的糟糕方式.


哪个选项是对的,还是两个都没有?导致此警告的原因是什么?

Mar*_*n R 6

正确的解决方案是使用可选绑定而不是强制解包运算符!.实际上,您可以将支票 value != nil纳入switch声明:

for (key, value) in dict {
    switch value {
    case let s as String:
        newDict[key] = s
    case let i as Int:
        newDict[key] = String(i)
    case let b as Bool:
        newDict[key] = b ? "1" : "0"
    case let v?:   // value is not `nil`
        newDict[key] = String(v)
    default:       // value is `nil`
        break
    }
}
Run Code Online (Sandbox Code Playgroud)