2014-10-15 2 views
0

При использовании этого кода:Ошибка при помощи подстрочный дополнительного массива

let result: AnyObject! = hitResults[0] 

Я получаю следующее сообщение об ошибке:

[AnyObject]? does not have a member named 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

Это происходит потому, что hitTest возвращает дополнительный массив, так что вам нужно разворачивать перед его использованием.

Вместо того, чтобы проверить, что hitResults имеет счетчик> 0, вы можете проверить, что там первый объект существует, а затем перейти к использованию этого объекта

if let firstHit = scnView.hitTest(p, options: nil)?.first { 
    // safely use firstHit here... 
} 
0

Вы не можете использовать индекс в необязательном массиве. [AnyObject]? Является необязательным массивом типа AnyObject. Если вы уверены, что hitResults не ноль, вы можете развернуть его! затем используйте индекс.

let result: AnyObject! = hitResults![0] 
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 не пустой, или nil:

// check that we clicked on at least one object and retrieve it 
if let result = hitResults?.first { 
    /* safely use result here */ 
} 
Смежные вопросы