使用可选数组的下标时出错

时间:2014-10-15 23:40:28

标签: swift ios8

使用此代码时:

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()
        }
    }

有谁知道这里的问题是什么?

3 个答案:

答案 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...
}