Quando si parla di creare un "metodo privato" in Swift o ObjC (o ruby o java o ...) questi metodi non sono realmente privati. Non esiste un controllo di accesso effettivo intorno a loro. Qualsiasi linguaggio che offra anche un po 'di introspezione consente agli sviluppatori di ottenere quei valori dall'esterno della classe, se lo desiderano.
Quindi quello di cui stiamo veramente parlando qui è un modo per definire un'interfaccia pubblica che si limita a presentare le funzionalità che vogliamo e "nasconde" il resto che consideriamo "privato".
Il meccanismo di Swift per la dichiarazione delle interfacce è protocol
, e può essere utilizzato a questo scopo.
protocol MyClass {
var publicProperty:Int {get set}
func publicMethod(foo:String)->String
}
class MyClassImplementation : MyClass {
var publicProperty:Int = 5
var privateProperty:Int = 8
func publicMethod(foo:String)->String{
return privateMethod(foo)
}
func privateMethod(foo:String)->String{
return "Hello \(foo)"
}
}
Ricorda, i protocolli sono tipi di prima classe e possono essere utilizzati ovunque un tipo può. E , se usati in questo modo, espongono solo le proprie interfacce, non quelle del tipo di implementazione.
Quindi, fintanto che usi MyClass
invece che MyClassImplementation
nei tuoi tipi di parametri, ecc. Dovrebbe funzionare tutto:
func breakingAndEntering(foo:MyClass)->String{
return foo.privateMethod()
}
Ci sono alcuni casi di assegnazione diretta in cui devi essere esplicito con il tipo invece di fare affidamento su Swift per dedurlo, ma questo non sembra un problema:
var myClass:MyClass = MyClassImplementation()
Usare i protocolli in questo modo è semantico, ragionevolmente conciso e ai miei occhi assomiglia molto alle estensioni di classe che abbiamo usato per questo scopo in ObjC.