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:
enableExperimentalFeaturebisa break antar minor version compiler. GunakanenableUpcomingFeatureuntuk 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])
),
]
)
]