Avatar
omochimetaru 4/2/2024 1:41 PM
うわあー
1:41 PM
型推論のえぐいの引いた
1:42 PM
public final class JSFunction { public convenience init< S: JSNativeObject, A0: ConstructibleFromJSValue, A1: ConstructibleFromJSValue >( _ selector: @escaping (S) -> (A0, A1) -> Void ) where A0.Constructed == A0, A1.Constructed == A1 { let impl = { (this: JSObject?, arguments: [JSValue]) -> JSValue in selector(this!.native as! S)( A0.construct(from: arguments[0])!, A1.construct(from: arguments[1])! ) return .undefined } print(S.self, A0.self, A1.self) self.init(impl: impl) } }
1:42 PM
これに対して
1:43 PM
public class WebNode { public func insertBefore(_ node: WebNode, _ ref: WebNode?) public func _get_property(_ name: String) -> JSValue { switch name { case "childNodes": childNodes.jsValue case "firstChild": firstChild.jsValue case "nextSibling": nextSibling.jsValue case "parentNode": parentNode.jsValue case "description": description.jsValue case "appendChild": JSFunction(Self.appendChild).jsValue case "insertBefore": JSFunction(Self.insertBefore).jsValue case "remove": JSFunction(Self.remove).jsValue case "removeChild": JSFunction(Self.removeChild).jsValue default: .undefined } } }
1:43 PM
これを呼び出したら
1:45 PM
(WebNode) -> (WebNode, WebNode?) -> Void がマッチして
1:45 PM
S == WebNode, A0 == WebNode, A1 == WebNode? と解決されると思ったが
1:46 PM
S == WebNode, A0 == WebNode, A1 == WebNode と解決されてしまった