Section 3/71 menit

3. Sintaks dan Cara Kerja

3. Sintaks dan Cara Kerja

Deklarasi

swift
// Variabel
package var internalConfig = Configuration()

// Fungsi
package func setupDatabase() { }

// Class / Struct / Enum
package class PackageRouter { }
package struct PackageConfiguration { }
package enum PackageState { case ready, loading, error }

// Protocol
package protocol PackageServiceProtocol { }

// Extension
package extension String {
    func trimmedAndLowercased() -> String {
        trimmingCharacters(in: .whitespaces).lowercased()
    }
}

// Init
package class Service {
    package init(config: Configuration) { }
    package var config: Configuration
    package func start() { }
    
    // Internal — hanya dalam module ini
    func internalOperation() { }
}

Mengaktifkan di Package.swift

swift
// Package.swift — tidak perlu setting khusus untuk Swift 6
// Package access level otomatis tersedia

let package = Package(
    name: "MyApp",
    targets: [
        .target(
            name: "Core",
            swiftSettings: [
                .swiftLanguageVersion(.v6)  // aktifkan Swift 6
            ]
        ),
        .target(
            name: "Features",
            dependencies: ["Core"],
            swiftSettings: [
                .swiftLanguageVersion(.v6)
            ]
        )
    ]
)

Package vs Internal: Perbedaan

swift
// Module A (dalam Package yang sama)
public class PublicClass {
    public var publicProp = 0       // accessible dari mana saja
    package var packageProp = 0     // accessible dari semua module dalam package ini
    internal var internalProp = 0   // hanya dalam Module A
    private var privateProp = 0     // hanya dalam class ini
}

// Module B (dalam Package yang sama)
import ModuleA

let obj = PublicClass()
print(obj.publicProp)    // ✅ OK
print(obj.packageProp)   // ✅ OK (same package)
print(obj.internalProp)  // ❌ ERROR (different module)

// Consumer App (di luar Package)
import ModuleA

let obj = PublicClass()
print(obj.publicProp)    // ✅ OK
print(obj.packageProp)   // ❌ ERROR (different package)