Section 2/71 menit

2. Teori: Access Control di Swift

2. Teori: Access Control di Swift

Hierarchy Access Control

Swift 6 kini punya 6 level, dari paling terbatas ke paling luas:

swift
private       hanya dalam declaration + extension di file yang sama
fileprivate   seluruh file
internal      seluruh module (default)
package       seluruh Swift Package (NEW in Swift 6)
public        accessible dari luar, tapi tidak bisa di-subclass/override dari luar
open          accessible dan bisa di-subclass/override dari luar

Apa itu "Package" dalam Konteks ini?

Dalam Swift Package Manager, sebuah package adalah unit distribusi yang didefinisikan oleh Package.swift. Satu package bisa punya beberapa targets (yang menjadi modules terpisah).

swift
// Package.swift
let package = Package(
    name: "MySDK",
    targets: [
        .target(name: "Core"),       // Module 1
        .target(name: "Analytics",   // Module 2
            dependencies: ["Core"]),
        .target(name: "UI",          // Module 3
            dependencies: ["Core"]),
    ]
)

package access level berarti: visible ke semua targets dalam satu Package.swift.

Boundary yang Jelas

swift
Consumer App ──────────────────────────────────────────────────────
│  (tidak bisa akses `package` symbols dari MySDK)                 │
└──────────────────────────────────────────────────────────────────┘
                           ↕ public / open only
┌──────────────────────────────────────────────────────────────────┐
│  MySDK Package                                                   │
│  ┌─────────────┐   package   ┌───────────────┐                  │
│  │    Core     │ ←─────────→ │   Analytics   │                  │
│  │   Module    │   access    │    Module     │                  │
│  └─────────────┘             └───────────────┘                  │
│         ↕ packagepackage                   │
│  ┌─────────────┐                                                 │
│  │     UI      │                                                 │
│  │   Module    │                                                 │
│  └─────────────┘                                                 │
└──────────────────────────────────────────────────────────────────┘