簡體   English   中英

協議一致性的Swift訪問控制

[英]Swift access control on protocol conformance

我有一個在文件中定義的私有協議,如下所示

private protocol testProtocol {
 func testFunc1()
 func testFunc2()
}

公共類符合上述協議如下

 public class testClass : testProtocol {
 func testFunc1() {}
 func testFunc2() {}
}

根據apples文檔,默認情況下,公共類的成員獲得內部訪問控制,除非它明確設置為不同的訪問控制修飾符。

該文檔還說,類型與具有較低訪問控制的協議的一致性將使該類型的協議訪問控制的實現與協議的實現相同。 在這種情況下,由於類型的訪問控制是公共的,並且協議訪問控制是私有的,因此方法testfunc1和testfunc2應該獲得私有的訪問控制。

當在不同的源文件中實例化類並且如下所示訪問方法時,編譯器不會顯示不期望的錯誤,因為根據指南,方法應該是私有的

var test: testClass = testClass()
test.testFunc1()

這是預期的行為嗎? 我錯過了什么嗎?

Apple文檔說:

在編寫或擴展類型以符合協議時,必須確保每個協議要求的類型實現至少具有與該協議類型一致的訪問級別。

根據這一點,我假設在testClass中使用另一個訪問控制修飾符實現方法testFunc1和testFunc2只是覆蓋了來自協議的方法。 如果使用此方法的默認協議實現,則以下編譯器將返回錯誤:

extension testProtocol {
    func testFunc1() {}
    func testFunc2() {}
}

至於Swift是面向協議的語言,用協議替換繼承,如果你想在自定義類中更改協議定義的函數訪問級別,這可能是合理的。

根據Apple的文檔:

在編寫或擴展類型以符合協議時,必須確保>每種協議要求的類型實現至少具有與該協議類型一致的訪問級別。

請注意文檔中的“至少” ,這意味着只要協議要求的類型實現的訪問級別高於或等於協議的訪問級別,就可以了。 在您的情況下,testClass中的testFunc1和testFunc2具有內部的默認訪問級別,它高於私有的訪問級別。 所以實際上testClass中的兩個方法獲得了內部的訪問級別,編譯器不會將其視為錯誤。

我們可以更改您的代碼,如下所示:

    fileprivate protocol TestProtocol {
        func testFunc1()
        func testFunc2()
    }

    public class TestClass : TestProtocol {
        public func testFunc1() {}
        public func testFunc2() {}
   }

這段代碼也將編譯而沒有錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM