[Xcode] Array 배열을 Double로 변경하는 중에 에러가 발생하고 있습니다.
조회수 501회
안녕하세요.
연결된 블루투스로부터 데이터를 받아와 가공한 후
charts를 이용하여 그래프를 그리려고 하고 있습니다.
현재 앱은 구조상 3개의 Tab bar Controller로 이루어져 있고,
각 탭바를 A,B,C라고 하면 B에서 데이터를 받고 저장한 후
C에서 그 데이터를 이용하여 그래프를 보여주려고 합니다.
B에는 Array에 데이터를 저장하고 있습니다.
public var UserDis : Array<String> = []
UserDis.append(String(valDis))
C에서는
var transferedData: Array<String> = SerialViewController().UserDis.
로 불러 온 뒤
하나하나의 값을 뽑아서 Double로 변환 후 차트를 그리는 setChart에 집어넣으려고 하고 있습니다.
for i in 0...transferedData.endIndex-1{
let inputData = Double(transferedData[i])!
setChart(values: [inputData])
}
그런데 이 과정에서 에러가 뜨고 있습니다.
transferedData 모든 element를 이용하기 위해 for문을 도입을 해서 endIndex-1을 해줘서 실행을 시키면
Thread 1: Fatal error: Can't form Range with upperBound < lowerBound
라는 에러가 뜹니다.
그래서 혹시나 제가 잘못알고 있나 싶어서
for i in 0...transferedData.endIndex{
let inputData = Double(transferedData[i])!
setChart(values: [inputData])
}
로 수정을 해서 실행을 하면 Double로 변환하는 과정 중에
Thread 1: Fatal error: Index out of range
라는 오류가 생깁니다.
ㅠㅠ
인터넷을 찾아봐도 제가 생각하기에는 틀린 부분을 못 찾겠습니다. ㅠㅠ
어떻게 고치면 될까요?
1 답변
-
transferedData
가 비어있을 경우의 예외 처리를 하셔야 합니다.transferedData.endIndex
가0
일 경우, 그 값에다-1
을 해버리면 위에 적어주신 첫 번째 에러가 발생합니다.에러 문구만 해석해 봐도, lowerBound (코드에서는
0
) 이 upperBound (코드상으로는transferedData.endIndex-1
, 즉-1
) 보다 큰 range를 만들 수 없다고 하는 상황입니다. 빈 데이타를 예상하고 계시지 않았다면 데이타를 수급하는 쪽 코드를 한 번 확인해 보세요.두 번째 에러는
혹시나 하는 마음에 이렇게 하면 되지 않을까 상상하신 것 같은데, 예상하신대로 안 되는 그 이유가 맞습니다. 어림도 없죠.
동적 range를 만들 경우에는
stride(to: by:)
를 쓰는걸 권고합니다. 작성하신 것 처럼 범위 자체를 생성하는게 실패하지 않도록, 안전하게요.위 코드는 일반적으로 잘 알려진
for ; ;
만 써도 에러는 없어 질 겁니다. range 방식과의 성능 차이는 일반적인 상황에서 매우 사소하기에 요즘엔 거의 코딩 취향의 차이로 갈리지만... 위 상황에선for ; ;
구문을 쓰면 더 좋을 수 있다는 생각이 드네요.switf 4에서는
for ; ;
가 없군요. -_-;만약
transferedData
가 slice된 Array라면 range를 만들 때endIndex
사용에 주의하실 필요가 있습니다. 이걸 다루려면 이야기가 조금 복잡해 지겠지만, 질문자 분 경우는 아닌 것 같으니 패스!마지막으로 Xcode라는 강력한 개발도구를 사용하고 계시므로, 상황이 되신다면 디버깅을 해 보세요. 위와 같은 문제는 오히려 쉽게 잡으실 수 있을거에요.
- 친절한 답변 감사드립니다. 저는 B에서 데이터를 가공한 후 데이터를 처리해서 C에서 받아서 사용하는 것으로 생각했습니다. 그래서 공백을 생각지도 못했습니다. 현재 B의 데이터가 C로 못 넘어가서 이런 오류가 발생한 것 같습니다. 현재 swift 4에서 작성하고 있어, for ; ; 는 사용이 불가능하고, 동적 range쪽은 제가 더 공부를 한 후에 실수없이 적용을 하도록 하겠습니다. 제가 안드로이드쪽에서 넘어와 xcode를 잘 몰라서 디버깅을 alert로 진행을 하고 있었는데, Array쪽은 alert로 띄워지지도 않아서 애를 많이 먹고 있었습니다 ㅠㅠ 디버깅을 활용해서 데이터를 잘 살펴보겠습니다. 감사합니다. GyeongUk Moon 2019.9.16 14:41
- swift 4에는 없어요? 아.. 옛날에 만져본거 티냈네 -_-ㅋ부끄럽습니다. doodoji 2019.9.16 15:48
댓글 입력