Имплементация ObjC протокола в Kotlin
Objective-C может иметь протокол такого вида:
@protocol WKNavigationDelegate <NSObject>
@optional
- (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WK_NULL_UNSPECIFIED WKNavigation *)navigation;
- (void)webView:(WKWebView *)webView didFinishNavigation:(WK_NULL_UNSPECIFIED WKNavigation *)navigation;
@end
и в Kotlin данный протокол переходит с одинаковой сигнатурой - имя функции webView с двумя аргументами, у которых типы WKWebView и WKNavigation.
class NavigationDelegate: NSObject(), WKNavigationDelegateProtocol {
override fun webView(webView: WKWebView, didStartProvisionalNavigation: WKNavigation?) { }
override fun webView(webView: WKWebView, didFinishNavigation: WKNavigation?) { }
}
Для IDE и компилятора будет считаться ошибкой, если реализуются оба метода:
Conflicting overloads: public open fun webView(webView: WKWebView, didStartProvisionalNavigation: WKNavigation?): Unit defined in ...public open fun webView(webView: WKWebView, didFinishNavigation: WKNavigation?): Unit defined in ...
Но по правде, для Kotlin/Native, это допустимо (только в случаях реализации методов от протоколов ObjC). И для работы требуется использовать Suppress:
@Suppress("CONFLICTING_OVERLOADS")
class NavigationDelegate: NSObject(), WKNavigationDelegateProtocol {
override fun webView(webView: WKWebView, didStartProvisionalNavigation: WKNavigation?) { }
override fun webView(webView: WKWebView, didFinishNavigation: WKNavigation?) { }
}