在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

因此,我正在编写一个Swift框架,其中我希望仅通过
协议
公开一些对象

例如:

我想隐藏我的实现细节,因此我创建了一个
内部
类:

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
是一个内部类。因此,它将覆盖public
x
变量的可访问性,有效地使该变量成为内部变量。因此,将此变量的可访问性设置为
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
}