Avatar
omochimetaru 4/2/2024 3:21 PM
そうね
3:22 PM
Swiftネイティブな暗黙のアップキャストやasを使わせたい場合にclassが必要という事だと思う
3:23 PM
public struct JSHTMLElement: CustomStringConvertible { public init(jsObject: JSObject) { self.jsObject = jsObject } public let jsObject: JSObject public var jsValue: JSValue { .object(jsObject) } public func asNode() -> JSNode { JSNode(jsObject: jsObject) } } public struct JSNode: Equatable & Hashable & CustomStringConvertible { public init(jsObject: JSObject) { self.jsObject = jsObject } public let jsObject: JSObject public var jsValue: JSValue { .object(jsObject) } public func asHTMLElement() -> JSHTMLElement? { if jsObject.isInstanceOf(JSWindow.global.HTMLElement) { return JSHTMLElement(jsObject: jsObject) } else { return nil } } public func asText() -> JSText? { if jsObject.isInstanceOf(JSWindow.global.Text) { return JSText(jsObject: jsObject) } else { return nil } } }
3:24 PM
今JavaScriptKitの上で構築してる型付きインターフェースでは、継承関係があっても値型にして、 アップキャストとダウンキャストは明示的なメソッドにしている (edited)
3:25 PM
こうしないと、JSNode をコンストラクトするときに、値の真の型に応じたサブクラスで包むのが難しい(厳密にやろうとするとサブクラスが200種類とかある) (edited)