Xcode 12 와 Swift Package 에 담긴 Swift UI Preview

Simon
7 min readAug 30, 2020

--

Xcode 12 부터는 Swift Package를 만들고, SwiftUI 코드를 추가해서 Preview 와 함께 쾌적한 SwiftUI View 개발을 하실 수 있습니다. WWDC20의 Swift packages: Resources and localization Session 에서 그 내용을 찾을 수 있습니다.

다만 Xcode 12 beta 6 에서는 몇 가지 문제를 해결하는 과정이 필요합니다.

TL;DR Xcode 12 beta 6 에서 Swift Package에 담은 SwiftUI View 를 Preview 해 보려면 오류가 발생하는데, 이를 해결하기 위해서는 Package.swift 의 Package.platforms 에 .iOS(.v13) 을 추가하고 Package 와 함께 생성되는 Test Target을 삭제해야 iOS Simulator 에서 SwiftUI Preview를 볼 수 있습니다.

Package 를 만들고 문제를 해결하는 과정
Swift Package 에서 SwiftUI Preview

Xcode 12 에서 Menu의 File > New > Swift Package … 를 선택해서 새로운 Package를 만든다음

Swift Package 만들기

SwiftUI 파일을 하나 추가 (Sources/<Package 이름> 폴더 에서 Menu 의 File > New > File 을 선택) 하면 준비가 끝납니다.

Swift Package에 SwiftUI View 추가

그런데 대부분의 경우, 이 글을 작성중인 현재의 최신버전인 Xcode 12 beta 6 에서는 아래처럼 오류가 발생해서 Preview 확인을 할 수 없는 문제를 만나게 됩니다.

  • Viewtype 을 찾을 수 없다거나 somereturn type은 iOS 13 이상에서만 사용가능하다는 오류
Cannot find type 'View' in scope
'some' return typs are only available in iOS 13.0.0 or newer
  • Test Target 을 컴파일 할 수 없다거나 arm64-apple-ios-simulator를 찾을 수 없다는 등 일관적이지 않은 다양한 형태의 오류
…/View2/Tests/View2Tests/View2Tests.swift:2:18: error: could not find module 'View2' for target 'arm64-apple-ios-simulator'; found: x86_64-apple-ios-simulator

또는,

SchemeBuildError: Failed to build the scheme “MySwiftUIView”
no such module ‘MySwiftUIView’
Compile MySwiftUIViewTests.swift (x86_64):
/Users/simon/Documents/workspace/SwiftUIPreview/MySwiftUIView/Tests/MySwiftUIViewTests/MySwiftUIViewTests.swift:2:18: error: no such module ‘MySwiftUIView’

‘View’ 와 ‘some’ return type 문제 해결

정확한 원인이 무엇이다 라고 확신할 수 는 없지만 제가 선택한 해결방법은 Package.swift의 Package.platforms 에 .iOS(.v13) 을 지정하는것 이었습니다.

Xcode 가 기본으로 만들어주는 Package.swift의 내용

Swift Package 를 만들면서 Xcode 12가 기본으로 만들어준 Package.swift 에 platforms: [.iOS(.v13)] 을 추가하면 ‘View’ type을 못찾거나 ‘some’ return type을 지원하지 않는다는 오류가 사라집니다. 물론 .macOS, .watchOS, .tvOS 등 Preview가 필요한 platform을 추가로 지정할 수도 있습니다.

하지만 이 방법으로 작성된 Swift Package는 Deployment Target 이 iOS 13 보다 낮은 App 프로젝트에서 사용할 수 없기 때문에 상용프로젝트에 이 Package를 사용하고자 할 때 문제가 될 수 있습니다.

예를들어 iOS 13 에서만 SwiftUI 기반의 View를 사용하고, 이전 버전의 iOS 에서는 다른 View를 사용하는 형태의 상용 프로젝트라면 이 Package를 포함할 수 없겠지요. Xcode Scheme 에서 Preview 를 위한 Platform 버전 을 지정할 수 있는 방법이 있다면 좋겠지만, 아직 찾지 못했습니다.

‘arm64-apple-ios-simulator’ 를 찾을 수 없다는 문제 해결

SwiftUI View 코드의 의 Preview를 시작하라고 했을뿐인데 arm64-apple-ios-simulator를 찾을 수 없다는 오류가 발생합니다. 저는 아직(?) x86_64 Macbook Pro를 사용하고 있는데 말이죠.

x86_64 Macbook Pro 에서 arm64-apple-ios-simulator module 을 찾는다

자세한 내막은 알 수 없지만 오류가 발생한 빌드 로그를 보면 arm64 와 x86_64 target에서 Testing module 을 컴파일 하려는 시도가 목격됩니다.

Swift Package 를 만들거나 열어서 SwiftUI View를 Preview를 하는 지금과 같은 상황에서는 보통의 App 프로젝트 처럼 빌드/실행 관련 설정을 할 수 있는곳이 없기 때문에 제가 선택할 수 있는 방법이 많지 않았습니다. Xcode 12 정식 버전에서는 해결되기를 기대 해 봅니다.

빌드가 안되면 지우자(?)

제가 선택한 방법은, 어떻게든 Preview를 봐야했기에, Package.swift 에서 Test Target을 지우는것입니다.

Package에 기본 포함된 Test Target
삭제된 Test Target

찜찜하지만 어쩔 수 없습니다. 기분좋은 해결책은 다음기회에.

다양한 Platform 에서의 Preview

위 두 가지 문제를 해결하고 나면 iOS 뿐만 아니라 macOS, watchOS, 혹은 tvOS 에서도 Preview를 보면서 SwiftUI View 개발을 계속하실 수 있습니다.

이상입니다.

--

--