이번 편의 목표: Xcode의 Run과 터미널의 swift run으로 프로그램을 실행하고, 메인 액터 기본값을 패키지에 명시합니다.

11편의 앱은 Xcode가 빌드하고 서명해 내 맥에서 실행합니다. Run이 성공하면 창이 뜨고, 실패하면 이슈 내비게이터에 첫 오류가 남습니다. 스위프트 6에서는 데이터 경합으로 의심되는 공유도 오류로 남습니다. 오류 줄의 액터와 await를 먼저 읽습니다.

터미널에서 실행 파일을 만들려면 소스 하나로 충분할 때 swiftc를 씁니다.

swiftc Hello.swift -o Hello

./Hello

창이 없는 명령줄 도구를 디렉터리로 키울 때는 패키지를 만듭니다.

swift package init --type executable --name Library

생성된 Package.swift의 도구 버전을 6.2 이상으로 두고, 주석이 없는 코드를 메인 액터에서 실행하도록 대상을 설정합니다. 새 Xcode 앱은 이 기본이 이미 켜져 있을 수 있고, 패키지는 파일에 적어야 같습니다.

Swift
// swift-tools-version: 6.2
import PackageDescription

let package = Package(
    name: "Library",
    targets: [
        .executableTarget(
            name: "Library",
            swiftSettings: [
                .defaultIsolation(MainActor.self)
            ]
        )
    ]
)

Sources/Library/main.swift에 10편의 showFee 호출을 두고 실행합니다.

swift run

도구 버전이 6.2보다 낮으면 defaultIsolation 설정 자체를 패키지가 모릅니다. 첫 줄의 도구 버전을 올린 뒤 다시 실행합니다. 출력 300이 보이면 컴파일러, 패키지 설정, 메인 액터 함수가 한 경로로 연결된 것입니다.

배포용 맥 앱은 Xcode의 Product 메뉴에서 Archive로 묶습니다. 개발 중 Run은 개발 서명으로 현재 맥에서만 실행합니다. 다른 사람에게 넘길 설치 파일은 서명과 공증이 더 필요하므로, 이 연재의 확인 범위는 내 맥에서의 실행까지입니다.

여기까지가 맥에서 스위프트를 쓰는 기본 경로입니다. 값은 타입과 옵셔널로 구분하고, 독립된 데이터는 구조체에 두고, 공유해야 하는 대상만 클래스로 둡니다. 실패는 오류로 돌려 호출자가 처리합니다. 화면은 메인 액터의 SwiftUI 뷰가 그리고, 실행은 Xcode Run 또는 swift run이 맡습니다.

직접 해 보기

main.swift에서 일수를 5, 하루 요금을 150으로 바꿔 swift run의 출력이 750인지 확인하세요. Xcode 앱의 단추도 같은 계산을 보여 주게 맞춥니다.

해설

두 실행 경로의 곱은 같습니다. 터미널은 print가 750을 출력하고, 창은 Text가 750원을 보여 줍니다. 계산 함수를 한곳에 두면 인자만 맞춰도 두 결과가 같이 바뀝니다.