协议一致性的Swift访问控制

时间:2015-09-30 22:39:05

标签: ios protocols swift2 access-control

我在文件中定义了一个私有协议,如下所示

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

公共类符合上述协议如下

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

根据apples文档,默认情况下,公共类的成员会获得内部访问控制,除非它明确设置为不同的访问控制修饰符。

该文档还说,类型与具有较低访问控制的协议的一致性将使该类型的协议访问控制的实现与协议的实现相同。在这种情况下,因为类型的访问控制是公共的,并且协议访问控制是私有的,所以方法testfunc1和testfunc2应该获得私有的访问控制。

当在不同的源文件中实例化类并且方法如下所示访问时,编译器不会显示错误,这是因为方法应该按照指南私有

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

这是预期的行为吗?我错过了什么吗?

2 个答案:

答案 0 :(得分:4)

Apple Documentation说:

  

当您编写或扩展类型以符合协议时,您必须确保每个协议要求的类型实现至少具有与该协议类型一致的访问级别。

根据这一点,我假设在testClass中使用另一个访问控制修饰符实现方法testFunc1和testFunc2只是覆盖了来自协议的方法。如果使用此方法的默认协议实现,则以下编译器将返回错误:

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

对于Swift是面向协议的语言,用协议替换继承,如果你想在自定义类中更改协议定义的函数访问级别,它可能是合理的。

答案 1 :(得分:0)

根据Apple的文档:

  

当您编写或扩展类型以符合协议时,您必须确保>每个协议要求的类型实现至少相同>访问级别作为类型与该协议的一致性。

请注意文档中的“至少”,这意味着只要该类型的协议要求的实现的访问级别高于或等于< / strong>协议的访问级别,没关系。在您的情况下,testClass中的testFunc1和testFunc2具有内部的默认访问级别,它高于私有的访问级别。所以实际上testClass中的两个方法获得了内部的访问级别,编译器不会将其视为错误。

我们可以按如下方式更改您的代码:

A[:] = collections.OrderedDict.fromkeys(A)
return len(A)

这段代码也会编译而不会出错。