Wenn man davon spricht, eine "private Methode" in Swift oder ObjC (oder Ruby oder Java oder ...) zu erstellen, sind diese Methoden nicht wirklich privat. Es gibt keine tatsächliche Zugangskontrolle um sie herum. Jede Sprache, die auch nur ein wenig Selbstbeobachtung bietet, ermöglicht es Entwicklern, diese Werte von außerhalb der Klasse zu erreichen, wenn sie dies wirklich möchten.
Also , was wir wirklich über hier sprechen , ist eine Möglichkeit , eine öffentlich zugängliche Schnittstelle zu definieren , dass lediglich stellt die Funktionalität , die wir es wollen, und „versteckt“ der Rest , dass wir „privat“ in Betracht ziehen.
Der Swift-Mechanismus zum Deklarieren von Schnittstellen ist der protocol
und kann für diesen Zweck verwendet werden.
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)"
}
}
Denken Sie daran, dass Protokolle erstklassige Typen sind und überall dort verwendet werden können, wo ein Typ dies kann. Und wenn sie auf diese Weise verwendet werden, legen sie nur ihre eigenen Schnittstellen offen, nicht die des Implementierungstyps.
Solange Sie MyClass
statt MyClassImplementation
in Ihren Parametertypen usw. verwenden, sollte alles nur funktionieren:
func breakingAndEntering(foo:MyClass)->String{
return foo.privateMethod()
//ERROR: 'MyClass' does not have a member named 'privateMethod'
}
Es gibt einige Fälle direkter Zuweisung, in denen Sie den Typ explizit angeben müssen, anstatt sich auf Swift zu verlassen, um darauf zu schließen, aber das scheint kaum ein Deal Breaker zu sein:
var myClass:MyClass = MyClassImplementation()
Die Verwendung von Protokollen auf diese Weise ist semantisch, ziemlich präzise und ähnelt in meinen Augen stark den Klassenerweiterungen, die wir für diesen Zweck in ObjC verwendet haben.