Section 4/101 menit

4. Konfigurasi di Swift Package Manager

4. Konfigurasi di Swift Package Manager

4.1 Swift Language Version per Target

swift
// Package.swift
// swift-tools-version: 5.10  ← minimum tools version

import PackageDescription

let package = Package(
    name: "MyPackage",
    platforms: [
        .iOS(.v16),
        .macOS(.v13),
    ],
    products: [
        .library(name: "MyPackage", targets: ["Core", "Features"]),
    ],
    targets: [
        // Target dengan Swift 6
        .target(
            name: "Core",
            swiftSettings: [
                .swiftLanguageVersion(.v6)
            ]
        ),
        
        // Target tetap Swift 5
        .target(
            name: "LegacySupport",
            swiftSettings: [
                .swiftLanguageVersion(.v5)
            ]
        ),
        
        // Target migrasi: Swift 5 + strict concurrency warning
        .target(
            name: "Features",
            dependencies: ["Core", "LegacySupport"],
            swiftSettings: [
                .swiftLanguageVersion(.v5),
                .enableUpcomingFeature("StrictConcurrency"),
                .enableUpcomingFeature("ExistentialAny"),
            ]
        ),
        
        // Test target dengan Swift Testing
        .testTarget(
            name: "CoreTests",
            dependencies: ["Core"],
            swiftSettings: [
                .swiftLanguageVersion(.v6)
            ]
        ),
    ]
)

4.2 Upcoming Features yang Bisa Di-enable di Swift 5

Daftar fitur yang bisa di-enable satu per satu sebelum full Swift 6:

swift
// Package.swift — semua upcoming features yang tersedia
.target(
    name: "MyTarget",
    swiftSettings: [
        // Concurrency
        .enableUpcomingFeature("StrictConcurrency"),
        
        // Type system
        .enableUpcomingFeature("ExistentialAny"),         // 'any Protocol' wajib
        .enableUpcomingFeature("ImplicitOpenExistentials"),
        
        // Language
        .enableUpcomingFeature("BareSlashRegexLiterals"), // /regex/ syntax
        .enableUpcomingFeature("ConciseMagicFile"),       // #file lebih ringkas
        .enableUpcomingFeature("ForwardTrailingClosures"),
        .enableUpcomingFeature("DisableOutwardActorInference"),
        
        // Swift 6 fitur spesifik
        .enableUpcomingFeature("TypedThrows"),
    ]
)

4.3 Experimental Features (Hati-hati)

swift
// Fitur yang masih experimental — bisa berubah
.target(
    name: "ExperimentalTarget",
    swiftSettings: [
        .enableExperimentalFeature("StrictConcurrency"),  // versi lama
        .enableExperimentalFeature("VariadicGenerics"),
    ]
)

Peringatan: enableExperimentalFeature bisa break antar minor version compiler. Gunakan enableUpcomingFeature untuk fitur yang sudah committed ke roadmap.

4.4 Conditional Dependencies Berdasarkan Platform

swift
// Package.swift
targets: [
    .target(
        name: "Networking",
        dependencies: [
            // Dependency berbeda berdasarkan platform
            .product(
                name: "AsyncHTTPClient",
                package: "async-http-client",
                condition: .when(platforms: [.linux])
            ),
        ]
    )
]