使用此代码时:
let result: AnyObject! = hitResults[0]
我收到以下错误:
的成员
[AnyObject]?
没有名为subscript
包含上下文功能:
func handleTap(gestureRecognize: UIGestureRecognizer) {
// retrieve the SCNView
let scnView = self.view as SCNView
// check what nodes are tapped
let p = gestureRecognize.locationInView(scnView)
let hitResults = scnView.hitTest(p, options: nil)
// check that we clicked on at least one object
if hitResults?.count > 0 {
// retrieved the first clicked object
let result: AnyObject! = hitResults[0]
// get its material
let material = result.node!.geometry?.firstMaterial
// highlight it
SCNTransaction.begin()
SCNTransaction.setAnimationDuration(0.5)
// on completion - unhighlight
SCNTransaction.setCompletionBlock {
SCNTransaction.begin()
SCNTransaction.setAnimationDuration(0.5)
material?.emission.contents = UIColor.blackColor()
SCNTransaction.commit()
}
material?.emission.contents = UIColor.redColor()
SCNTransaction.commit()
}
}
有谁知道这里的问题是什么?
答案 0 :(得分:0)
您不能在可选数组上使用下标。 [AnyObject]?
是AnyObject类型的可选数组。如果你确定hitResults是非零的,你可以打开它!然后使用下标。
let result: AnyObject! = hitResults![0]
答案 1 :(得分:0)
由于hitResults
是[AnyObject]?
,因此您无法在不首先展开它的情况下调用其上的下标。最安全的方法是使用可选绑定,如下所示:
// check that we clicked on at least one object
if hitResults?.count > 0 {
// retrieved the first clicked object
if let result: AnyObject = hitResults?[0] {
/* safely use result here */
}
}
或者,更好的是,您可以使用first
Array
属性的可选绑定,如果Array
不为空,则返回数组中的第一个元素,或{{1 }}:
nil
答案 2 :(得分:0)
这是因为hitTest
返回一个可选数组,因此您需要在使用它之前解包。
而不是检查hitResults是否有计数> 0,你可以检查第一个对象是否存在,然后继续使用该对象
if let firstHit = scnView.hitTest(p, options: nil)?.first {
// safely use firstHit here...
}