2017-01-04 4 views
0

2D 배열의 UIView를 만들려고합니다. 데이터로 배열을 채우기 전까지 모든 것이 작동하는 것 같습니다. 나는 오류 : "치명적인 오류 : 인덱스 범위를 벗어난"Swift 3 - UIView의 2D 배열

내가 현재 무엇을 가지고 :

for y in 0 ... 10 { 
    for x in 0 ... 10 { 

     let cell : UIView! 
     cell = UIView(frame: CGRect(x:10, y:10, width:10, height:10)) 
     self.view?.addSubview(cell) 

     gridArray[x][y] = cell 
    } 
} 

답변

1

문제는 다음과 같습니다

var gridArray : [[UIView]] = [[UIView]]() 

지금 내가 UIViews와 배열을 채우기 위해 시도 배열 배열을 만들고 있지만 내부 배열을 만들지는 않습니다. 빈 배열을 인덱싱 할 수 없습니다. 이 같은 UIView?11 x 11 배열을 만들 수 있습니다

var gridArray: [[UIView?]] = Array(repeating: Array(repeating: nil, count: 11), count: 11) 

는 그런 다음 코드는 UIView의와 배열이 작동 채우기 위해. 나중에 읽을 때 UIView?의 껍질을 벗겨야합니다. 그러나 배열을 UIView으로 채우므로 무력화가 충돌없이 작동하는 경우입니다.

let cell = gradArray[x][y]! 

@rmaddy이 코멘트에 언급 한 바와 같이, 당신은 배열을 초기화하는 더미의 UIView을 사용할 수

var gridArray: [[UIView]] = Array(repeating: Array(repeating: UIView(), count: 11), count: 11) 

를이 UIView 여기에 121 참조를 가지고 있고, 그것은 것 것 모든 참조가 실제 UIView으로 대체 된 후 ARC에 의해 해제 될 수 있습니다.

이점은 (선택 사항)UIView입니다. 따라서 언 래핑이 필요하지 않을 수 있습니다. 스위프트는 추론 할 수있을 것입니다 때문에

또한, 당신은 다음 유형을 드롭 수 : 기본 이니셜 라이저와 배열, 배열이 비어 초기화하면

var gridArray = Array(repeating: Array(repeating: UIView(), count: 11), count: 11) 
+1

작품! 고맙습니다. – Terminal

+1

루프 안의 실제 뷰로 대체되는 하나의 더미 UIView 인스턴스로 내부 배열을 채워 선택적 뷰를 피할 수 있습니다. – rmaddy

+0

감사합니다. @rmaddy. 더미 UIView 사용에 대한 토론을 포함하도록 답변을 업데이트했습니다. – vacawama

1

, 당신은 빈 배열로 첨자 수 없습니다 .

첨자로 배열에 액세스하기 전에, 당신은 배열에 실제 내용을 기입해야합니다 : 마법처럼

var gridArray: [[UIView]] = [] 
    for y in 0 ... 10 { 
     var rowArray: [UIView] = [] 
     for x in 0 ... 10 { 

      let cell : UIView! 
      cell = UIView(frame: CGRect(x:10, y:10, width:10, height:10)) 
      self.view?.addSubview(cell) 

      rowArray.append(cell) 
     } 
     gridArray.append(rowArray) 
    }