在swift中实现具有内部类的公共协议
因此,我正在编写一个Swift框架,其中我希望仅通过在swift中实现具有内部类的公共协议,swift,swift2,Swift,Swift2,因此,我正在编写一个Swift框架,其中我希望仅通过协议公开一些对象 例如: 我想隐藏我的实现细节,因此我创建了一个内部类: internal class ThingImpl : Thing { public private(set) var x : Int = 0 } 并通过工厂方法销售新的产品: public func newThing() -> Thing { return ThingImpl() } 我不明白的是,为什么编译器警告我要在ThingImpl中公开v
协议
公开一些对象
例如:
我想隐藏我的实现细节,因此我创建了一个内部
类:
internal class ThingImpl : Thing {
public private(set) var x : Int = 0
}
并通过工厂方法销售新的产品
:
public func newThing() -> Thing {
return ThingImpl()
}
我不明白的是,为什么编译器警告我要在ThingImpl
中公开var x
,并鼓励我将其声明为内部
尽管有警告,但一切都正常运行,如果我注意到警告并更改为internal private(set)var x:Int=0
,警告就会消失,一切仍然正常运行
在我看来,将var公开是正确的做法,因为它在它所实现的公共协议中是公开的。
我是不是遗漏了什么?谢谢。ThingImpl
是一个内部类。因此,它将覆盖publicx
变量的可访问性,有效地使该变量成为内部变量。因此,将此变量的可访问性设置为public
是多余的。请记住:
- 私有:仅对其源文件可用
- 内部:可用于其整个模块
- 公共:每个人都可以使用
您的实现类:
internal class ThingImpl : Thing {
<#access#> var x : Int = 0
}
内部类ThingImpl:Thing{
变量x:Int=0
}
访问控制的可能性:
private
:不可能,x需要具有读取权限才能符合要求(协议中的属性在设计上是公共的)
public
:在内部类中没有多大意义,但它可以编译(带有警告)
private(set)
:它只允许修改同一源文件中的x
internal
:默认情况下,如果您不设置任何访问控制,它将允许在同一模块(框架、目标等)中修改x
public-private(set)
:同时使变量public
和private
没有多大意义,是吗?。如果它在内部
类中,则更少
IMHO有两个合理的选择:
- 不包括任何访问控制,并让x在模块中可写
- 使用
private(set)
限制对其文件的写入访问
但它是通过Thing协议公开的,对吗?如果您通过Thing
协议访问它,它是公开的。但是您不能通过其他模块的ThingImpl
访问x
。我的意思是,两个案子没有关系是的,我想是他们没有关系,我觉得很难接受。我的意思是,ThingImpl声明为确认Thing(它是公共的),因此它必须有一个公共var x:Int{get}。啊!:)是的,问题是采用公共协议使变量可以公开读取。public-private(set)
是有意义的,因为我希望公共接口(协议)包含一个只读变量,但能够在我的私有/内部实现中修改它。thing中的x
是只读的(您只在其声明中包含了get
)。使用internal
(或仅为空)您可以完全做到这一点:x
是可读的,因为Thing以这种方式声明它,并且它在内部是可写的(在同一个模块中)。
internal class ThingImpl : Thing {
<#access#> var x : Int = 0
}