Xcode 6에서 새로 생긴 기능으로 Playground 라는것이 있습니다. Playground 에서 Swift 코드를 인터렉티브한 환경에서 테스트할 수 있습니다. 코드들을 컴파일 하거나 컴파일이 완료된 프로젝트를 실행하지 않고 Playground에서 당신의 실험적인 코드들의 결과를 빠르게 확인할 수 있습니다.
Playground 둘러보기
Xcode를 실행했을 때 “Get started with a playground”를 선택하여 곧바로 Playground 프로젝트를 실행할 수 있습니다. 또는 File > New > Playground 를 선택하여 시작할 수 있습니다.
.playground라는 확장자를 가진 파일이 생성되며 위와 같이 결과가 바로 출력되는 사이드바를 가진 창을 확인할 수 있습니다. Playground에서의 Xcode는 당신이 코드의 한 문장이 끝나거나 타이핑을 잠시 멈췄을 때 코드의 결과를 소스 에디터 오른편에 위치한 사이드바에 출력합니다.
이제 몇가지 테스트용 코드를 작성하여 보았습니다. 오른쪽 사이드바를 보면 작성한 함수가 호출될때 내부적으로 어떻게 값이 변하는지 함수의 결과값이 무엇인지 변수의 값이 무엇인지 순환문이 몇번 반복되는지 여부를 확인할 수 있습니다.
의도적이지만 잘못된 코드를 한번 작성해보았습니다. 이미 정의된 j를 재정의 해보려고 하였더니 곧바로 에러가 출력되는것을 확인할 수 있습니다. Xcode는 친절하게도 당신이 작성중인 코드의 잘못된 부분을 빨간색 느낌표 심볼을 사용하여 즉시 알려줍니다. 저 심볼을 클릭하게 되면 무엇을 실수하였는지 상세한 설명을 볼 수 있습니다. 실수한 부분을 알맞게 수정하거나 삭제하면 Xcode는 코드의 정상적인 실행 결과를 오른쪽 사이드바에 다시 표시해 줍니다.
코드의 중간에 변수의 값을 확인하고 싶다면 별도의 라인에 변수명을 적기만 하면 됩니다. 위의 예시를 보면 width와 height 변수를 각각 별도의 라인에 적어줌으로써 사이드바에 결과값을 확인할 수 있습니다.
사이드바의 순환문의 결과부분에 마우스 커서를 올려보면 위와 같은 동그라미 아이콘이 보여집니다. Value History Button이라고 하는데요, 이것을 눌러 오른쪽과 같은 값의 변화를 그래프로 확인할 수 있습니다. 심지어 소요된 시간을 확인할 수 있어 시간이 많이 소요되는 순환문의 경우 이 그래프를 확인하며 최적화 작업을 할 수 있습니다.
이 그래프의 X축은 시간의 변화를 보여주며 Y축은 값의 변화를 보여줍니다. 위의 스크린샷과 같이 특정 지점을 마우스로 클릭하면 그 지점의 값을 확인할 수 있습니다.
오른쪽 하단에 보면 Timeline 이라고 불리는 막대바가 있습니다. 이 바를 움직여보시면 하나의 순환문이 아닌 전체 코드들의 실행 순서를 차례대로 돌려볼 수 있습니다. 실제로 오래걸리는 순환문을 만들어 보면 그것이 실행되면서 그래프를 그리는 모습을 눈으로 관찰하실 수 있습니다.
Timeline의 막대바 옆에는 얼마나 오래동안 이 그래프가 만들어지는 과정을 보여줄것인가 제한을 설정할 수 있습니다. 레퍼런스를 읽어봤을때는 동작이 제한 시간에 걸리면 멈추는것으로 나와있는데요 테스트해본 결과 멈추지 않고 모두 실행되어 버리는것을 확인하였습니다. 좀더 확인을 해봐야 할것 같네요.
UIKit을 활용한 테스트 코드 작성하기
기본 환경에서 Playground를 사용중이라면 UILabel이라던가 UIView와 같은 UIKit에 포함된 컨트롤러를 이용한 테스트 코드를 사용할 수 없는것을 확인할 수 있었습니다. UIKit을 Import하면 당연히 될것이라 생각했는데 안되더군요. 다음과 같은 설정을 해주시면 간단히 가능하게 됩니다.
View > Utilities > Show File Inspector 에 진입해 보면 Playground Settings가 있습니다. 여기에 Platform 설정을 iOS로 바꿔주시면 됩니다. 이제부턴 UIKit을 사용할 수 있게 되었습니다.
이거 정말 멋지다고 생각하는데요. 현재 만들어지는 있는 각각의 컨트롤러에 대해 사이드뷰에서 눈 모양의 아이콘을 클릭하면 현재 모습을 확인할 수 있습니다. 특정 UI를 만들겠다면 정말 손쉽게 구현해보고 테스트 해볼 수 있을것 같습니다.