class Runtime {
public static let shared = Runtime()
var context: JSContext!
let preface = [
"Generated with quicktype",
"For more options, try https://app.quicktype.io"
]
private init() {
}
var isInitialized: Bool {
return nil != context
}
var _quicktypeJavaScript: String?
var quicktypeJavaScript: String? {
if nil == _quicktypeJavaScript {
guard let javascriptPath = Bundle.main.url(forResource: "quicktype", withExtension: "js") else { return nil }
guard let data = try? Data(contentsOf: javascriptPath) else { return nil }
_quicktypeJavaScript = String(data: data, encoding: .utf8)
}
return _quicktypeJavaScript
}
func initialize() -> Bool {
guard let context = JSContext() else { return false }
context.exceptionHandler = { context, exception in
print("JS Error: \(exception?.description ?? "unknown error")")
}
context.evaluateScript("""
var window = {};
var setTimeout = function(f) { f(); };
var clearTimeout = function() {};
var console = {};
""")
let consoleLog: @convention(block) (Any) -> Void = { print($0) }
context.objectForKeyedSubscript("console").setObject(consoleLog, forKeyedSubscript: "log" as NSString)
guard let javascript = quicktypeJavaScript else { return false }
context.evaluateScript(javascript)
self.context = context
return true
}
private func resolve(resolve: @escaping ([String]) -> Void) {
let resolveBlock: @convention(block) ([String]) -> Void = { resolve($0) }
context.setObject(resolveBlock, forKeyedSubscript: "resolve" as NSString)
}
private func reject(reject: @escaping (String) -> Void) {
let rejectBlock: @convention(block) (String) -> Void = { reject($0) }
context.setObject(rejectBlock, forKeyedSubscript: "reject" as NSString)
}
func renderOptionsToJavaScriptObject(_ options: [String: Any]) -> String {
return "{ " + options.map { key, value in
var javaScriptValue = "\(value)"
switch value {
case is String: javaScriptValue = "\"\(value)\""
default: break
}
return "\"\(key)\": \(javaScriptValue)"
}.joined(separator: ", ") + " }"
}
func quicktype(_ json: String, topLevel: String, language: Language, options: [String: Any], fail: @escaping (String) -> Void, success: @escaping ([String]) -> Void) {
// .header (C header files) are assumed to be Objective-C headers
if language == .objcHeader {
return quicktype(json, topLevel: topLevel, language:.objc, options: options, fail: fail, success: success)
}
resolve { lines in success(lines) }
reject { errorMessage in fail(errorMessage) }
let comments = preface.map { "\"\($0)\"" }.joined(separator: ",")
context.evaluateScript("""
function swifttype(json) {
window.quicktype.quicktype({
lang: "\(language.rawValue)",
sources: [{
kind: "json",
name: "\(topLevel)",
samples: [json]
}],
leadingComments: [\(comments)],
rendererOptions: \(renderOptionsToJavaScriptObject(options)),
}).then(function(result) {
resolve(result.lines);
}).catch(function(e) {
reject(e.toString());
});
}
""")
let swifttype = context.objectForKeyedSubscript("swifttype")!
swifttype.call(withArguments: [json])
}
}
quicktype代碼
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
相關閱讀更多精彩內容
- 先父類后子類 從上面代碼可得:父類靜態(tài)代碼塊>main函數(處于父類)>子類靜態(tài)代碼塊>main函數(處于子類)>...
- 如何在Swift的代碼中使用OC的代碼, 在OC的代碼中使用Swift的代碼? 一、OC的代碼中使用Swift代碼...
- 所有工具已升級,請使用CC系列工具,舊版已不現維護,目前已無法使用 進入 CC官網 前往 [ 官網下載] Cod...
- 所有工具已升級,請使用CC系列工具,舊版已不現維護,目前已無法使用 進入 CC官網 前往 [ 官網下載] Cod...
- 普通代碼塊:在方法或語句中出現的{}就稱為普通代碼塊。普通代碼塊和一般的語句執(zhí)行順序由他們在代碼中出現的次序決定-...