[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

라는 오류가 생깁니다.

ㅠㅠ

인터넷을 찾아봐도 제가 생각하기에는 틀린 부분을 못 찾겠습니다. ㅠㅠ

어떻게 고치면 될까요?

  • transferedData.endIndex 가 0이겠는데요. nowp 2019.9.16 13:58
  • 아... 그래서 저런 오류가 발생하고 있는거네요... B에서 데이터가 저장이 되는 것 까지는 확인을 했는데 왜 이렇게 되는건지도 알고 계시나요? ㅠㅠ GyeongUk Moon 2019.9.16 14:03
  • 지금 데이터를 전달하는 걸 알아보고 있는데 안드로이드랑은 다르게 데이터를 struct로 선언해서 따로 보내줘야 하는게 맞나요? GyeongUk Moon 2019.9.16 14:21

1 답변

  • 좋아요

    1

    싫어요
    채택 취소하기

    transferedData 가 비어있을 경우의 예외 처리를 하셔야 합니다. transferedData.endIndex0 일 경우, 그 값에다 -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

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)