首先我相信你是有意的
protocol PageViewControllerDelegate {
associatedtype T: UIViewController
func pageViewController(pageViewController: PageViewController, didScrollToViewController viewController: T)
}
虽然这是旧版 Swift 的旧线程,但typealias 可能已在协议中使用。
Objective-C 似乎不支持关联类型,因此无法同时提供可选协议实现和关联类型;但是,您可以通过利用通过扩展提供默认实现的协议要求来有效地创建可选实现,如下所示:
protocol PageViewControllerDelegate {
associatedtype T: UIViewController
func pageViewController(pageViewController: PageViewController, didScrollToViewController viewController: T)
}
extension PageViewControllerDelegate {
// Does nothing on its own. Note that because this method is a requirement of the protocol, dynamic dispatch is used instead of static dispatch
func pageViewController(pageViewController: PageViewController, didScrollToViewController viewController: T) {}
}
class MyClass: PageViewControllerDelegate {
typealias T = UIPageViewController
// No compile-time errors for an effectively optional method
// Custom implementation
//func pageViewController(pageViewController: PageViewController, didScrollToViewController viewController: UIPageViewController) {
//
//}
}
您不能将变量声明为具有关联类型的协议的类型,因为声明不明确。这类似于在 Swift 中不允许简单地将变量声明为 Array 类型:由于其泛型参数,没有单一的 Array 类型。关联类型是泛型类型的泛型参数的协议等价物。有关其他一些协议功能的进一步说明,请参阅here。
你可以试试这些方法
protocol PageViewControllerDelegate {
associatedtype T: UIViewController
func pageViewController(pageViewController: PageViewController<Self>, didScrollToViewController viewController: T)
}
extension PageViewControllerDelegate {
func pageViewController(pageViewController: PageViewController<Self>, didScrollToViewController viewController: T) {}
}
class PageViewController<Delegate: PageViewControllerDelegate> : UIViewController, UIScrollViewDelegate {
private var delegate: Delegate?
}
final class MyDelegate: PageViewControllerDelegate {
typealias T = UIPageViewController
func pageViewController(pageViewController: PageViewController<MyDelegate>, didScrollToViewController viewController: UIPageViewController) {
// Do something
}
}
唯一的缺点是必须在协议方法中使用Self 将委托标记为final。
这是一个旧线程,现在您可能已经很清楚这些功能和特性了。希望这对您有所帮助。