Swift 3.0에서 큰 2차원 배열 로드하기.

조회수 3054회

Swift에서 큰 2차원 배열을 로딩할 일이 있는데요, 예를들어 이런 코드입니다.

let p:[[Int]] = [[10,6],[42,42],[30,46],[42,36],[7,9],[22,24],[29,25],[16,1],[15,38],[35,7],[34,14],[14,4],[34,6],[9,15],[13,31],[11,46],[40,42],[16,13],[2,18],[28,16],[22,9],[32,42],[43,34],[22,26],[16,9],[43,18],[47,3],[11,11],[49,23],[3,22],[12,43],[49,42],[49,38],[33,24],[48,46],[17,25],[29,18],[6,38],[26,29],[43,8],[8,5],[17,3],[24,39],[38,9],[33,35],[2,15],[28,46],[32,11],[20,43],[8,35]]

이 때 배열의 크기가 조금만 길어지면 컴파일 하는 시간이 너무 오래 걸리더라구요. 파이썬이나 루비 같은 코드에서는 저정도 크기의 배열은 바로 초기화가 되서 사용할 수 있는데 스위프트는 그게 안되네요.

혹시 큰 배열에 정해진 값을 쉽게 초기화 할 수 있는 방법이 있을까요?

파일에 값을 넣은 다음에 이걸 파싱해서 배열을 만들어내는 방법을 고려하고 있기는 합니다만, 가능하면 코드에 바로 넣고 싶네요.

2 답변

  • 좋아요

    2

    싫어요
    채택 취소하기

    swift에서 인덱싱 문제로 이슈가 있는 것으로 알고 있습니다.

    계속 indexing만 하다가 빌드는 도저히 안되는 문제가 생깁니다. 그래서 구글링을 통해 나온 해결방안으로는 append(_:)를 통해 값을 초기화 하는 거였습니다.

    var p: [[Int]] = []
    p.append([10,6])
    p.append([42,42])
    ....
    
    

    이런식으로 값을 초기화 하게 되면 가독성 문제가 생깁니다 코드도 당연히 길어지고 말이죠.

    차라리 파일이나 json 타입으로 가지고 와서 루프 문을 이용해서 배열을 만들어 쓰시는게 낫지 않을까 싶습니다.

  • 스위프트 2.x에서 array와 dictionary literal 컴파일 이슈가 버그리포팅되었습니다

    구글 검색하면 나오는 12시간씩 걸리더라 하는 이슈입니다 https://bugs.swift.org/browse/SR-305?jql=text%20~%20%22long%20array%22

    스위프트 3에서 일부 개선되어서 동작은 하지만 여전히 느리기는 하네요.

    제가 실험해보고 확인해 본 사항은 배열 리터널 내부에 128개까지는 O(1)로 동작하지만 그 이후에는 O(n)으로 점차 느려집니다.

    스위프트 컴파일러 구조적으로 성능 최적화가 덜 되어 있고 스위프트 4에서는 좀 더 개선될 것으로 기대하고 있습니다.

    덧붙임.

    또 다른 의미에서 보면 리터널하게 128개 이상 선언하는 코드는 좋은 것 같지는 않네요 :)

    • (•́ ✖ •̀)
      알 수 없는 사용자

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

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

(ಠ_ಠ)
(ಠ‿ಠ)