2015-12-08 70 views
1

我正在快速構建一個框架。我正在創建一個在框架中處理BLE東西的類。這個類應該是公開的,因爲我需要從使用我的框架的外部應用程序訪問這個類。我的類結構是如下:爲什麼委託方法需要在Swift中公開?

public class MyClass: NSObject, CBCentralManagerDelegate { 
} 

MyClass這裏是公開的,這證實一個公共協議CBCentralManagerDelegate。編譯器強制我將它的委託方法聲明爲public。因此,這裏是我的實現是什麼樣子:

public class MyClass: NSObject, CBCentralManagerDelegate { 
    public func centralManager(central: CBCentralManager, didConnectPeripheral peripheral: CBPeripheral) { 

    } 
    // I don't want delegate methods to be public, delegate methods should be like: 
    //func centralManager(central: CBCentralManager, didConnectPeripheral peripheral: CBPeripheral) { 

    //} 
} 

我有探索蘋果文檔here和SO質疑here。我開始知道,因爲我的課程和協議都是公開的,所以方法應該公開。

問題是,外部應用程序可以很容易地創建我的類的實例,並調用這個方法,這是我的框架不期望的。

我想保持委託方法私人,所以沒有人可以手動調用它們。

我有什麼可能的解決方案?

+0

你不能避免這種情況。一個協議描述了你的類的* public *接口。你不能只隱藏它。 – Sulthan

回答

2

試圖在公共類中隱藏公共協議的方法沒有什麼意義,因爲它首先破壞了使用協議的目的。

如果你真的需要隱藏起來,你可以添加一個私有實例變量,將作爲一個代表,而不是類本身是這樣的:

public class MyClass: SomeClass 
{ 
    private let someVariable 
    private var subdelegate :DelegateType? 

    public override func viewDidLoad() 
    { 
     super.viewDidLoad() 
     subdelegate = DelegateType(parent: self) 
     someOtherObject.delegate = subdelegate 
    } 
} 

然後實現在DelegateType委託方法。

private class DelegateType : NSObject, HiddenProtocol 
{ 
    private weak var parent: MyClass? 

    init(parent: MyClass) 
    { 
     super.init() 
     self.parent = parent 
    } 

    // Implement delegate methods here by accessing the members 
    // of the parent through the 'parent' variable 
} 
+0

感謝您的答案和評論,但公開的問題是,任何人都可以手動調用這些方法,委託方法並不意味着手動調用,那麼這是什麼? –

+0

委託方法意味着被定義它們的類以外的對象調用。這就是使用協議的重點,讓其他類知道它可以響應某些特定的方法。顯然,並非所有的客戶都需要或應該看到這些信息,但是當他們全都公開時,不應該區分應該與其他人應該什麼。 –

+0

爲什麼他們需要「公開」,不應該「內部」呢?我不明白這裏的編譯器... – fabb

相關問題