在swift中使用内部类实现公共协议

时间:2015-10-30 11:43:21

标签: swift swift2

所以我正在编写一个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并鼓励我将其声明为内部。

enter image description here

尽管有警告,一切都运行良好,如果我注意到警告并改为internal private(set) var x : Int = 0警告消失,事情仍然正常。

在我看来,将var公开是正确的事情,因为它正在实施的公共协议中公开。 我在这里错过了什么吗?感谢。

2 个答案:

答案 0 :(得分:3)

ThingImpl是一个内部类。因此,它将覆盖公共x变量的可访问性,从而有效地使此变量成为内部变量。因此,将此变量的可访问性设置为public是多余的。

答案 1 :(得分:0)

记住this

  • private:仅适用于其源文件
  • 内部:可用于整个模块
  • public:每个人都可以使用

您的实施班级:

internal class ThingImpl : Thing {
    <#access#> var x : Int = 0
}

访问控制可能性:

  • private:不可能,x需要具有符合Thing的读取权限(协议中的属性是公共设计)
  • public:在内部课程中没有多大意义,但它会编译(带警告)
  • private(set):它只允许在同一源文件中修改x
  • internal:默认情况下,如果您没有放置任何访问控制,它将允许在同一模块(框架,目标等)中修改x
  • public private(set):同时制作变量publicprivate并没有多大意义,是吗?如果它在internal类中,则更少。

恕我直言,有两个合理的选择:

  • 不要包含任何访问控制,让x在模块中可写
  • 使用private(set)限制对其文件的写入权限