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 MyClassinvece che MyClassImplementationnei 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.