2015-09-30 2 views
9

У меня есть частный протокол, определенный в файле, как показано нижеSwift контроля доступа по протоколу соответствия

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

Общественный класс соответствует приведенному выше протоколу следующим

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

В соответствии с яблоками документации, то члены открытого класса получают доступ к внутреннему контролю доступа по умолчанию, если он явно не установлен на другой модификатор управления доступом.

В документации также говорится, что соответствие типа протоколу с более низким контролем доступа сделает реализацию контроля доступа к протоколу таким же, как и протокол. В этом случае, поскольку управление доступом типа является общедоступным, а управление доступом к протоколам является приватным, методы testfunc1 и testfunc2 должны получить доступ к частному управлению доступом.

Когда класс конкретизируется в другом исходном файле и методы доступны, как показано ниже, компилятор не выдает ошибку, которая не ожидается, так как методы должны быть закрытыми в соответствии с руководящими принципами

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

Это ожидаемое поведение? Я что-то упускаю?

+0

Вы нашли решение? – ZevsVU

ответ

4

Apple Documentation говорит:

When you write or extend a type to conform to a protocol, you must ensure that the type’s implementation of each protocol requirement has at least the same access level as the type’s conformance to that protocol.

В соответствии с этим я полагаю, что методы, реализующие testFunc1 и testFunc2 с другим контроля доступа модификатором внутри TestClass просто переопределяет, что из протокола. При использовании реализации протокола по умолчанию этих методов как следующий компилятор возвратит сообщение об ошибке:

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

Насколько Свифт протокол ориентированного языка с заменой наследования с протоколами это, вероятно, разумно, если вы хотите изменить протокол, определенный уровень доступа внутри вашего пользовательского класса.

0

Согласно документации Apple:

When you write or extend a type to conform to a protocol, you must ensure that > the type’s implementation of each protocol requirement has at least the same > access level as the type’s conformance to that protocol.

Пожалуйста, обрати внимание на «по крайней мере» в документе, то это означает, что до тех пор, пока уровень доступа реализации типа по требованиям протокола является выше или равно уровень доступа к протоколу, все будет хорошо. В вашем случае testFunc1 и testFunc2 из testClass имеют уровень доступа по умолчанию внутреннего уровня, он выше уровня доступа частного. Таким образом, фактически два метода в testClass получают уровень доступа внутри, а компилятор не будет рассматривать его как en error.

Мы можем изменить код немного следующим образом:

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

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

}

Этот фрагмент кода также компилируется без ошибок.

Смежные вопросы