首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 更多程式設計知識

Swift 存取控制完整指南:private、internal、public、open 與 setter 微調

     編輯:更多程式設計知識

Swift 存取控制以模組為邊界,提供五個層級。本文透過實例說明各層級語意、預設行為、Getter/Setter 不對稱設定與 Framework 發布注意事項。

五大層級速查

關鍵字可見範圍可繼承/覆寫適用對象
private同一宣告區塊 (大括號內)否實作細節、輔助屬性/方法
fileprivate同一原始檔檔案內檔案內 Extension 分組、單元測試
internal (預設)同一模組 (Target)模組內App 內部類別、Framework 內部 API
public任何匯入模組者否Framework 公開介面 (不可繼承)
open任何匯入模組者是Framework 公開介面 (可繼承/覆寫)

實例:清單項目模型


public class ListItem {
    // 公開屬性:任何人可讀寫
    public var text: String
    public var isComplete: Bool
    
    // 公開讀、私有寫:外部可讀 UUID,只有本檔案/模組能設定
    private(set) var UUID: NSUUID
    
    // 公開初始化器:Framework 使用者可建立實例
    public init(text: String, completed: Bool, UUID: NSUUID) {
        self.text = text
        self.isComplete = completed
        self.UUID = UUID
    }
    
    // internal (預設):模組內可用,Framework 外部不可見
    func refreshIdentity() {
        self.UUID = NSUUID()
    }
    
    // 公開覆寫:Framework 使用者可呼叫
    public override func isEqual(object: AnyObject?) -> Bool {
        if let item = object as? ListItem {
            return self.UUID == item.UUID
        }
        return false
    }
}

Getter/Setter 不對稱存取


public var readOnly: Int { get }           // 唯讀 (需在 init 設定)
public private(set) var readWriteInternal: Int  // 公開讀、模組內寫
public fileprivate(set) var readWriteFile: Int  // 公開讀、檔案內寫
internal public(set) var internalReadPublicWrite: Int  // 模組讀、公開寫 (罕用)

語法:accessLevel(setterAccessLevel) var name: Type,setter 層級**不能高於** getter。

預設行為:internal

  • 無修飾詞 = internal。
  • App 開發通常完全不需關心存取控制。
  • Framework 開發**必須**明確標記 public/open 給外部使用。

Framework 發布與 Objective-C 互通

產出類型生成標頭檔內容
App Target包含 public + internal 宣告
Framework Target僅包含 public/open 宣告

原因:Framework 標頭檔即 Objective-C 公開介面,internal 屬實作細節不應外洩。

Extension 存取控制


// 擴充自有類別:可存取 private/fileprivate
extension MyClass {
    private func helper() { ... }  // 同檔案可見
}

// 擴充外部類別:只能存取 public/open
extension SomeFrameworkClass {
    // 無法存取 fileprivate/private
    public func newMethod() { ... }
}

// 條件式 Extension (Protocol 限制)
extension Array where Element: Equatable {
    func firstIndex(of element: Element) -> Int? { ... }
}

常見模式

  1. 封裝實作細節:核心邏輯 private,對外暴露 public 介面。
  2. 唯讀公開屬性:public private(set) var 或 public let。
  3. 測試支援:@testable import 可存取 internal,單元測試不需降低存取層級。
  4. Framework 版本演進:新增 API 用 public,需開放繼承用 open,謹慎變更現有 public 簽章。

存取層級決策樹

需要外部 (其他模組) 使用?
├─ 是 → 需要被繼承/覆寫? → open
│       └─ 否 → public
└─ 否 → 需要同檔案其他類別/Extension 使用? → fileprivate
        ├─ 是 → 需要同模組其他檔案使用? → internal (預設)
        └─ 否 → private
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved