2015-10-30 118 views
4

因此,我正在編寫一個Swift框架,我只想通過公開一些對象。在swift中使用內部類實現公共協議

如:

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 xpublicThingImpl之內,並鼓勵我聲明它是內部的。

enter image description here

不顧一切警告運行正常,如果我聽從警告並切換到internal private(set) var x : Int = 0警告消失,事情仍然運行良好。

在我看來,製作var是正確的,因爲它在公共協議中是公開的。 我在這裏錯過了什麼嗎?謝謝。

回答

2

ThingImpl是一個內部類。所以它將覆蓋變量的公開x的可訪問性,從而有效地使這個變量成爲內部變量。因此,將此變量的可訪問性設置爲public是多餘的。

+0

但它是憑藉Thing協議公開的嗎? –

+0

如果您通過Thing協議訪問它,它是公開的。但是你不能通過其他模塊的'ThingImpl'來訪問'x'。我的意思是,兩個案件不相關 – t4nhpt

+0

是的,我猜這是他們沒有關係,我覺得很難接受。我的意思是,ThingImpl被宣佈確認Thing(這是公開的),因此它必須有一個公共變量x:Int {get}。哎呀! :) –

0

考慮到this

  • 私人:僅適用於它的源文件
  • 內部:適用於整個模塊
  • 市民:提供給大家

實現類:

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

訪問控制的可能性:

  • private:不可能的,X需要有讀訪問,以符合事情(在協議的屬性是由設計公共)
  • public:沒有太大意義在內部類,它編譯但(與警告)
  • private(set):它將允許同一個源文件只
  • internal在修改x:是默認的,如果你不把任何訪問控制,它將使在修改X相同的模塊(框架,目標,等等)
  • public private(set):使變量publicprivate在同一時間沒有多大意義,是嗎?如果它在internal課程中,則更少。

恕我直言,有兩種合理的選擇:

  • 不包含任何訪問控制,讓X是模塊
  • 使用private(set)在寫來限制它的文件的寫訪問
+0

是的,事情是,雖然採用公共協議公開使變量可讀。 –

+0

'public private(set)'是有意義的,因爲我希望公共接口(協議)包含一個只讀變量,但能夠在我的私有/內部實現中對其進行修改。 –

+0

事物中的'x'是隻讀的(你只在其聲明中包含'get')。使用'internal'(或者只是空白)你可以做到這一點:'x'是可讀的,因爲Thing聲明瞭它,並且它在內部是可寫的(在同一個模塊中)。 – djromero