"다들 'Swift 버전'이라고 부르는 숫자가 네 개인데, 진짜 Swift 버전은 그중 하나뿐이야."
Xcode냐, Command Line Tools만 있냐
Mac에 깔 수 있는 애플 툴체인은 두 종류야. Xcode는 전부 다 들어 있어. Swift 컴파일러, SwiftPM, xcodebuild, 플랫폼 SDK 전부(macOS, iOS, watchOS), 시뮬레이터, Instruments, 개발자 계정과 연동되는 서명 도구까지. Command Line Tools는 훨씬 작아. 컴파일러, SwiftPM, git, macOS SDK 정도야. iOS용은 아무것도 없고, 시뮬레이터도 없고, xcodebuild로 아카이브하거나 업로드할 수도 없어.
이 차이는 실제로 발목을 잡아. Command Line Tools만 깔린 가족 Mac 하나에서 SwiftPM 앱 빌드는 멀쩡히 됐는데, swift test를 돌리면 매번 no such module 'XCTest'로 죽었어. 그 도구엔 'Testing'도 없었고. 앱이 망가진 게 아니라 툴체인에 테스트 프레임워크가 안 들어 있었던 거야. 요즘 Command Line Tools엔 Swift Testing은 들어 있지만, XCTest는 여전히 없어. 그래서 그 Mac을 쓰는 레포들엔 딱 그 경우를 위한 작은 자체 테스트 실행 파일이 있어. 패키지 트랙에서 다시 만날 거야.
지금 셸이 뭘 쓰고 있는지는 xcode-select -p가 알려줘. xcrun은 선택된 개발자 디렉터리 안에서 swift, codesign, simctl, notarytool 같은 도구를 찾아줘. 스크립트가 전체 경로를 적는 대신 xcrun simctl로 부르는 이유가 그거야.
같은 숫자가 아닌 숫자 네 개
| 숫자 | 뭘 정하나 | 어디서 보나 |
|---|---|---|
| 컴파일러 버전 | 어떤 Swift 기능과 진단이 있는지(이 퀘스트의 빌드 Mac은 6.3.3) | swift --version |
| 언어 모드 | 컴파일러가 소스를 Swift 5 규칙으로 읽을지 Swift 6 규칙으로 읽을지(타깃마다 따로 정해) | swiftLanguageModes / SWIFT_VERSION |
| SDK 버전 | 네가 호출해도 되는 API가 어디까지인지(Xcode 26이면 26.x) | xcrun --sdk iphoneos --show-sdk-version |
| 배포 대상 | 네가 돌아간다고 약속하는 제일 오래된 OS(이 가족은 macOS 14 / iOS 17 / watchOS 10) | platforms: / deploymentTarget |
이걸 섞으면 확신에 찬 헛소리가 나와. "우리 Swift 6야"가 사실은 6.x 컴파일러로 모든 걸 Swift 5 모드에서 컴파일한다는 뜻일 수도 있어. 실제로 크래시 하나가 바로 그 틈으로 빠져나갔어. 26 SDK에서 새로 나온 API는 배포 대상이 iOS 17이면 if #available로 감싸기 전까진 컴파일조차 안 돼. 그 검사가 있어야 iOS 17 기기가 자기한테 없는 심볼에 손을 뻗지 않아.
애플은 해마다 최소 기준을 올려
애플은 가을마다 새 Xcode, SDK, Swift를 내고 업로드 최소 조건을 올려. 2026년 4월 28일부터는 App Store Connect에 올리는 iOS, iPadOS, tvOS, visionOS, watchOS 앱이 Xcode 26 이상과 26 SDK로 빌드돼야 해. 애플 공지엔 macOS가 없어. 배포 대상은 낮게 둬도 되지만, 빌드 툴체인은 최신이어야 한다는 거지. 이 퀘스트는 가족이 실제로 배포할 때 쓰는 기준에 맞춰져 있어. macOS 26에서 Swift 6.3.3, Xcode 26.6. Swift 6.4랑 Xcode 27은 WWDC 2026에서 발표됐어. 그게 빌드 Mac에 깔리면, 버전에 따라 달라지는 설명은 전부 기억에 기대지 말고 릴리스 노트로 다시 확인해.