2014-10-15 1 views
0

이 코드를 사용하는 경우 :오류 사용 첨자

let result: AnyObject! = hitResults[0] 

나는 다음과 같은 오류가 점점 오전 :

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

사람이 알고 있나요 : 문맥

[AnyObject]? does not have a member named subscript

포함하는 기능을 여기에 무슨 문제가 있니?

답변

0

이 발생합니다. 대신 hitResults이 카운트> 0이 있는지 확인하는

, 첫 번째 객체가 존재하는지 확인하고 해당 객체

if let firstHit = scnView.hitTest(p, options: nil)?.first { 
    // safely use firstHit here... 
} 
를 사용하여 수행 할 수
0

선택적 배열에서 첨자를 사용할 수 없습니다. [AnyObject]? AnyObject 유형의 선택적 배열입니다. hitResults가 non-nil이라는 것을 확신한다면, 이것을 unwrap 할 수 있습니다! 그런 다음 아래 첨자를 사용하십시오. hitResults 이후

let result: AnyObject! = hitResults![0] 
0

먼저 그것을 풀기없이에 첨자를 호출 할 수 없습니다, [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 */ 
    } 
} 

또는, 더 나은, 당신은 Array이 아닌 경우 배열의 첫 번째 요소를 반환 Arrayfirst 속성 바인딩을 선택 사용할 수 있습니다 :이 작업을 수행하는 가장 안전한 방법과 같이, 선택적 바인딩을 사용하고 빈, 또는 nil : 당신이 그것을 사용하기 전에 랩을 해제 할 필요가 있으므로 hitTest는 옵션 배열을 반환하기 때문에

// check that we clicked on at least one object and retrieve it 
if let result = hitResults?.first { 
    /* safely use result here */ 
}