所以我正在编写一个Swift框架,我想通过protocol
公开公开一些对象。
例如:
public protocol Thing : class {
var x : Int { get }
}
我想隐藏我的实现细节,因此我创建了一个internal
类:
internal class ThingImpl : Thing {
public private(set) var x : Int = 0
}
并通过工厂方法销售新的Things
:
public func newThing() -> Thing {
return ThingImpl()
}
我无法理解为什么编译器会警告我在var x
内制作public
ThingImpl
并鼓励我将其声明为内部。
尽管有警告,一切都运行良好,如果我注意到警告并改为internal private(set) var x : Int = 0
警告消失,事情仍然正常。
在我看来,将var公开是正确的事情,因为它正在实施的公共协议中公开。 我在这里错过了什么吗?感谢。
答案 0 :(得分:3)
ThingImpl
是一个内部类。因此,它将覆盖公共x
变量的可访问性,从而有效地使此变量成为内部变量。因此,将此变量的可访问性设置为public
是多余的。
答案 1 :(得分:0)
记住this:
您的实施班级:
internal class ThingImpl : Thing {
<#access#> var x : Int = 0
}
访问控制可能性:
private
:不可能,x需要具有符合Thing的读取权限(协议中的属性是公共设计)public
:在内部课程中没有多大意义,但它会编译(带警告)private(set)
:它只允许在同一源文件中修改x internal
:默认情况下,如果您没有放置任何访问控制,它将允许在同一模块(框架,目标等)中修改x public private(set)
:同时制作变量public
和private
并没有多大意义,是吗?如果它在internal
类中,则更少。恕我直言,有两个合理的选择:
private(set)
限制对其文件的写入权限