我一直在玩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
Run Code Online (Sandbox Code Playgroud)
Apple的文档说明如下
由于向下转换可能会失败,因此类型转换运算符有两种不同的形式.可选表单
as?将返回您尝试向下转换的类型的可选值.强制形式as尝试向下倾斜并强制将结果作为单个复合动作展开.
我不清楚为什么在这里使用as?而不是as正确的.一些测试显示,如果我更改test()以返回Int而不是String,如果我继续使用,代码将退出并出现错误as.如果我切换到使用as?那么代码将继续正常执行并跳过该语句(dict将保持为空).但是,我不确定为什么这是更可取的.在我看来,我宁愿程序退出并出现错误并让我知道演员表不成功然后只是忽略错误的声明并继续执行.
根据文档,我应该使用强制形式"只有当你确定转发将永远成功时".在这种情况下,我确信向下转换将永远成功,因为我知道test()只能返回一个字符串,所以我认为这是强制形式的向下转换的完美情况.那么为什么编译器会给我一个警告呢?
我正在使用Apple的SceneKit进行基本的赛车游戏,并且遇到了模拟汽车的问题.使用SCNPhysicsVehicle行为,我能够正确设置汽车并使用记录的方法驱动它.
但是,我无法获得该车的位置.似乎合乎逻辑的是,SCNPhysicsVehicle会在汽车移动时移动包含底盘和车轮的SCNNode,但SCNNodes仍保持其原始位置和方向.奇怪的是,底盘的SCNPhysicsBody的速度在整个模拟过程中保持准确,所以我可以假设汽车的位置是基于SCNPhysicsBody而不是SCNNode.不幸的是,我没有找到记录方法来获得SCNPhysicsBody的位置.
获得一个汽车的位置应该是微不足道的,并且对于创建一个赛车游戏是必不可少的,但我似乎找不到任何获得它的方法.任何想法或建议将不胜感激.