SwiftUIでコード内の文字をWebKitで表示してjavascriptの結果を受け取る

ContentView.swift

import SwiftUI
 
struct ContentView: View {
    var body: some View {
        WebView(url: URL(string: "dummy")!)
    }
}

WebView.swift

import SwiftUI
import WebKit
 
struct WebView: UIViewRepresentable {
    var url: URL
    
    func makeUIView(context: Context) -> WKWebView {
        let webConfig = WKWebViewConfiguration()
        let userController = WKUserContentController()
        userController.add(makeCoordinator(), name: "hoge")
        webConfig.userContentController = userController
        let wkWebView = WKWebView(frame: .zero, configuration: webConfig)
        return wkWebView
    }
    
    func updateUIView(_ uiView: WKWebView, context: Context) {
        // 普通にurlでブラウズするコード
        // let req = URLRequest(url: url)
        // uiView.load(req)
 
        // ローカルファイルindex.htmlを表示するコード
        // guard let path: String = Bundle.main.path(forResource: "index", ofType: "html")
        //     else { return }
        // let localHTMLUrl = URL(fileURLWithPath: path, isDirectory: false)
        // uiView.loadFileURL(localHTMLUrl, allowingReadAccessTo: localHTMLUrl)
 
        let str = "<!DOCTYPE html>"
        + "<html>"
        + "<head>"
        + "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"/>"
        + "<title>スマホでの見え方調整</title>"
        + "<meta name=\"viewport\" content=\"width=280\" />"
        + "</head>"
        + "<body>"
        +   "<input type=\"button\" value=\"Exec\" onclick=\"var number = 123;"
        +   "webkit.messageHandlers.hoge.postMessage(number);\" /><br />"
        +   "<br />"
        + "</body>"
        + "</html>"
        uiView.loadHTMLString(str, baseURL: nil)
    }
 
    func makeCoordinator() -> WebView.Coordinator {
        return Coordinator()
    }
    
} // struct
 
extension WebView {
    class Coordinator: NSObject, WKNavigationDelegate, WKScriptMessageHandler {
       func userContentController(
           _ userContentController: WKUserContentController,
           didReceive message: WKScriptMessage) {
               if message.name == "hoge" {
                 let number = message.body as! Int
                 print("JavaScript is sending a number \(number)")
            }
        }
    }
}
 
struct WebView_Previews: PreviewProvider {
    static var previews: some View {
        WebView(url: URL(string: "dummy")!)
    }
}