Bearbeiten: Gefunden einen einfachen Weg, um es zu verstecken. Zumindest aus der xcode-Schnellhilfe-Information: Setzen Sie die Adoption und die Implementierung einfach in eine Erweiterung Ihrer Klasse und sie wird dort nicht angezeigt.
Ursprüngliche Antwort:
kam ich mit diesem Beispiel auf, durch innere Klassen in Java inspiriert. Hier stellt MyVC
nicht dar, dass es UICollectionViewDelegate
für interne Zwecke implementiert, während die Delegat-Implementierung Zugriff auf MyVC
private Variablen hat.
public class MyVC: UIViewController {
private let a = 4 as Int
private var hiddenDelegate: HiddenDelegateImpl?
public override func viewDidLoad() {
super.viewDidLoad()
hiddenDelegate = HiddenDelegateImpl(outer: self)
innerCollectionView.delegate = hiddenDelegate
}
}
private class HiddenDelegateImpl: NSObject, UICollectionViewDelegate {
private weak var outer: MyVC?
init(outer: MyVC) {
self.outer = outer
super.init()
}
private func doStuff() -> Int {
// can access private variables of outer class
return outer?.a
}
// implement delegate methods here
}
Beachten Sie, dass HiddenDelegateImpl
auch eine innere Klasse von MyVC sein könnte, wählte ich es aus Gründen der Lesbarkeit außerhalb zu setzen.
Im Gegensatz zu Java müssen Instanzen innerer Klassen eine Instanz der äußeren Klasse existieren. Da dies bei Swift nicht der Fall ist, benötigen wir die Problemumgehung outer
.
Es gibt auch this nice example, die sich auf die Implementierung von Delegaten konzentriert.
Bearbeiten: Der Delegate eine Instanzvariable in der äußeren Klasse, um es zu behalten, und der Verweis auf die äußere Klasse schwach, um Retain-Zyklen zu vermeiden.
Nein, das ist nicht möglich. – mattt
hey @matt gibt es eine Erklärung dafür? – eyeballz
Swift verwendet explizite Zugriffssteuerung und nicht implizite Vertraulichkeit durch Schnittstellen-/Implementierungsaufteilung. Was Sie beschreiben, hat in Objective-C kein Analog. Wenn Sie Implementierungsdetails ausblenden möchten, müssen Sie die Kapselung verwenden. – mattt