Ответ 1
Изменить: Найдите простой способ скрыть его. По крайней мере, из быстрой справочной информации xcode: просто введите усыновление и реализацию в расширение вашего класса, и оно не появится там.
Исходный ответ:
Я придумал этот пример, вдохновленный внутренними классами Java. Здесь MyVC
не показывает, что он реализует UICollectionViewDelegate
для внутренних целей, тогда как реализация делегата имеет доступ к MyVC
частным переменным.
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
}
Обратите внимание, что HiddenDelegateImpl
также может быть внутренним классом MyVC, я выбрал его для чтения для чтения.
В отличие от экземпляров Java для внутренних классов необходим экземпляр внешнего класса. Так как это не так с Swift, нам необходимо обходное решение outer
.
Существует также этот хороший пример, в котором основное внимание уделяется реализации делегата.
Изменить: Сделал делегат переменной экземпляра во внешнем классе, чтобы сохранить его, а ссылка на внешний класс слаба, чтобы избежать сохранения циклов.