Skip to main content

Имплементация 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?) { }
}