swift 转js_swift 转 javascript - CSDN
  • 今晨,笔者在 Hacker News 的首页看到了这样一个开源项目 —— ShiftJS,这是一款将 Swift 代码转换为友好的 JavaScript 代码的编译器,即 Swift to JavaScript Transpiler,使用 JavaScript 编写,其主要贡献者为...

    今晨,笔者在 Hacker News 的首页看到了这样一个开源项目 —— ShiftJS,这是一款将 Swift 代码转换为友好的 JavaScript 代码的编译器,即 Swift to JavaScript Transpiler,使用 JavaScript 编写,其主要贡献者为来自纽约的软件开发者 Donald Steinert,该项目目前仍处于早期开发阶段。

    使用 ShiftJS 很简单,安装:

    npm install shift.js

    Getting Started

    将一个 Swift 文件编译为 JavaScript:

    shift.js example.swift

    标记一个 Swift 文件:

    shift.js -t example.swift

    从 Swift 文件中解析一个 AST:

    shift.js -a example.swift

    查看所有命令描述:

    shift.js --help

    现在,开发者们可以直接进入 ShiftJS 的官网尝试。

    2016 年 9 月 23-24 日,由 CSDN 和创新工场联合主办的“MDCC 2016 移动开发者大会• 中国”(Mobile Developer Conference China)将在北京• 国家会议中心召开,来自iOS、Android、跨平台开发、产品设计、VR开发、移动直播、人工智能、物联网、硬件开发、信息无障碍10个领域的技术专家将分享他们在各自行业的真知灼见。

    从8月8日起至9月4日,MDCC大会门票处于6.8折优惠票价阶段,五人以上团购更有特惠,限量供应(票务详情链接6.8折优惠,欲购从速!

    展开全文
  • 如何将JavaScript转化成Swift?(一) 如何将JavaScript转化成Swift?(二) 目前已经实现的效果 昨天让同事随意写了一段JavaSCript代码: function showdata() { var array = [0, 1, 2, 3, 4]; var result = true;...

    如何将JavaScript转化成Swift?(一)

    如何将JavaScript转化成Swift?(二)

    目前已经实现的效果

    昨天让同事随意写了一段JavaSCript代码:

    function showdata() {
      var array = [0, 1, 2, 3, 4];
      var result = true;
    
      if (result) {
        for (let index = 0; index < array.length; index++) {
          console.log(array[index]);
        }
      } else {
        console.log("noooooo!")
      }
      var obj = {
        name: 'wuli',
        sex: 0,
        age: 21
      };
      var string = "woxinshensihai";
      if (result) {
        console.log(string)
      }
      console.log(obj);
    }
    复制代码

    然后用翻译程序进行翻译,结果如下:

    func showdata() {
        var array = [
            0,
            1,
            2,
            3,
            4,
        ]
        var result: Bool = true
        if result {
            for (index, item) in array.enumerated() {
                print(array[index])
            }
        } else {
            print("noooooo!")
        }
        var obj = NamesexageModel(name: "wuli", sex: 0, age: 21)
        var string: String = "woxinshensihai"
        if result {
            print(string)
        }
        print(obj)
    }
    
    复制代码

    生成的Model文件:

    class NamesexageModel: NSObject { 
      var name: String
      var sex: Int
      var age: Int
    }
    复制代码

    从效果来看感觉还可以。。。

    For 循环翻译

    上篇文章中没有涉及 for 循环的翻译,这里补充一下:

    JavaScriptFor写法和Swift中的差异比较大,主要是因为Javascript 中的 Array 并不像大部分其他语言的数组。首先, Javascript 中的 Array 在内存上并不连续,其次, Array 的索引并不是指偏移量。实际上,Array 的索引也不是 Number 类型,而是 String 类型的。我们可以正确使用如 array[0] 的写法的原因是语言可以自动将 Number 类型的0转换成 String 类型的 “0”

    C 风格的 for 循环

    这种写法应该是JavaScript中用的最多的

    for (let index = 0; index < array.length; index++) {
        console.log(array[index]);
    }
    复制代码

    但是Swift自从Swift3.0开始不再支持C-Type的写法,这就有点蛋疼了

    Swift中的for循环写法

    for (index, item) in array.enumerated() {
        print(array[index])
    }
    复制代码

    对比两种语言for循环的实现,for循环方法体内部差不多,但是for循环的写法相差很多,所以我们主要修改 let index = 0; index < array.length; index++ 这一段代码

    先看一下for循环的AST:

    "body": [
        {
          "type": "ForStatement",
          "init": {
            "type": "VariableDeclaration",
            "declarations": [
              {
                "type": "VariableDeclarator",
                "id": {
                  "type": "Identifier",
                  "name": "index"
                },
                "init": {
                  "type": "Literal",
                  "value": 0,
                  "raw": "0"
                }
              }
            ],
            "kind": "let"
          },
          "test": {
            "type": "BinaryExpression",
            "left": {
              "type": "Identifier",
              "name": "index"
            },
            "operator": "<",
            "right": {
              "type": "MemberExpression",
              "object": {
                "type": "Identifier",
                "name": "array"
              },
              "property": {
                "type": "Identifier",
                "name": "length"
              },
              "computed": false
            }
          },
          "update": {
            "type": "UpdateExpression",
            "operator": "++",
            "prefix": false,
            "argument": {
              "type": "Identifier",
              "name": "index"
            }
          }
          ...
          ...
    复制代码

    body 下面的节点是 ForStatement 说明执行的是 escodegen.js 中的 ForStatement 方法,想要从 for (let index = 0; index < array.length; index++) { 转换成 for (index, item) in array.enumerated() { 我们只需要获取到 index关键字、array关键字即可

    if (stmt.test) {
      // 获取 index 关键字
      result.push(stmt.test.left.name)
      result.push(', item) in ')
      // 获取 array 关键字
      result.push(stmt.test.right.object.name)
      result.push('.enumerated()')
    } 
    复制代码

    这样就可以生成 for (index, item) in array.enumerated()

    这一段代码用来生成 index ++)只需要将它注释掉或者删除即可

    if (stmt.update) {
        result.push(space);
        result.push(that.generateExpression(stmt.update, Precedence.Sequence, E_TTT));
        result.push(')');
    } else {
        result.push(')');
    }
    复制代码

    ForIn for 循环

    for (index in array) {
     console.log(array[index]);
    }
    复制代码

    ForOf for 循环

    for (let item of array) {
      console.log(item);
    }
    复制代码

    Swift中对应的写法:

    for item in array {
        print(item)
    }
    复制代码

    这里翻译比较简单 只需要将 of 改成 in 即可

    代码格式化

    翻译程序生成的代码在格式方面不是很美观,这里借助 swiftformat 来对代码进行格式化,swiftformat 的安装很简单,只需要:

    > brew update
    > brew install swiftformat
    复制代码

    通过 JavaScript 执行 swiftformat fileName.swift --swiftversion 4.2

    const { exec } = require('child_process');
    exec('swiftformat ./Swift_Code/' + fileName + '.swift --swiftversion 4.2 ', (err, stdout, stderr) => {
        if(err) {
            return;
        }
    })
    复制代码

    关于如何翻译 JavaScript 的网络请求,由于 JavaScriptSwift 都有各自的网络请求库,这里需要统一方法名、参数,每个语言也需要封装各自的网络请求库;其次,SwiftJSON解析需要一个ClassModel,这里需要将 JSON 转 Swift Model Class......

    未完待续。。。

    转载于:https://juejin.im/post/5ca40c67f265da307b2d49d3

    展开全文
  • 此代码为swiftJavaScript之间方法的相互调用及传值,调用方法分两种,传值方法分两种。 点击打开链接

    Demo GitHub地址:点击打开链接  

    Demo CSDN地址: 点击打开链接

    如图:

    此代码为swift 与JavaScript之间方法的相互调用及传值,调用方法分两种,传值方法分两种。

    //
    //  ViewController.swift
    //  Test_js_swift
    //
    //  Created by gmy on 16/4/20.
    //  Copyright © 2016年 dhc. All rights reserved.
    //
    
    import UIKit
    import JavaScriptCore
    class ViewController: UIViewController {
     
        var context = JSContext()
        var jsContext: JSContext?
        
        @IBOutlet weak var webView: UIWebView!
        override func viewDidLoad() {
            super.viewDidLoad()
            webView.delegate = self
            loadJS()
            
        }
        
    
        
        //MARK: - loadJS
        func loadJS() {
            let path = NSBundle.mainBundle().pathForResource("test", ofType: "html")
            let url = NSURL(fileURLWithPath: path!)
            let request = NSURLRequest(URL: url)
            webView.loadRequest(request)
        
        }
       
        // Swift 调用JS 方法 (无参数)
        @IBAction func swift_js_pargram(sender: AnyObject) {
            self.context.evaluateScript("Swift_JS1()")
    //        self.webView.stringByEvaluatingJavaScriptFromString("Swift_JS1()") // 此方法也可行
        }
        
        // Swift 调用JS 方法 (有参数)
        @IBAction func swift_js_nopargam(sender: AnyObject) {
            self.context.evaluateScript("Swift_JS2('oc' ,'Swift')")
    //        self.webView.stringByEvaluatingJavaScriptFromString("Swift_JS2('oc','swift')") // 此方法也可行
        }
        
        func menthod1() {
            print("JS调用了无参数swift方法")
        }
        
        func menthod2(str1: String, str2: String) {
            print("JS调用了有参数swift方法:参数为\(str1),\(str2)")
        }
        
        func webView(webView: UIWebView, didFailLoadWithError error: NSError?) {
            print(error)
        }
    }
    
    extension ViewController: UIWebViewDelegate {
        func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool {
            let str = NSBundle.mainBundle().pathForResource("test", ofType: "html")
            let request = NSURLRequest(URL: NSURL(string: str!)!)
            let connecntion = NSURLConnection(request: request, delegate: self)
            connecntion?.start()
            return true
        }
        
        func webViewDidStartLoad(webView: UIWebView) {
            print("webViewDidStartLoad----")
            
        }
        
        func webViewDidFinishLoad(webView: UIWebView) {
            print("webViewDidFinishLoad----")
            self.context = webView.valueForKeyPath("documentView.webView.mainFrame.javaScriptContext") as! JSContext
            // JS调用了无参数swift方法
            let temp1: @convention(block) () ->() = {
                self.menthod1()
            }
            self.context.setObject(unsafeBitCast(temp1, AnyObject.self), forKeyedSubscript: "test1")
            
            // JS调用了有参数swift方法
            let temp2: @convention(block) () ->() = {
                let array = JSContext.currentArguments() // 这里接到的array中的内容是JSValue类型
                for object in array {
                    print(object)
                }
                self.menthod2(array[0].toString(), str2: array[1].toString())
            }
            self.context.setObject(unsafeBitCast(temp2, AnyObject.self), forKeyedSubscript: "test2")
            
            // 模型注入的方法
            
            let model = JSObjCModel()
            model.controller = self
            model.jsContext = context
            self.jsContext = context
            
            // 这一步是将OCModel这个模型注入到JS中,在JS就可以通过OCModel调用我们公暴露的方法了。
            self.jsContext?.setObject(model, forKeyedSubscript: "OCModel")
            let url = NSBundle.mainBundle().URLForResource("test", withExtension: "html")
            self.jsContext?.evaluateScript(try? String(contentsOfURL: url!, encoding: NSUTF8StringEncoding));
            
            self.jsContext?.exceptionHandler = {
                (context, exception) in
                print("exception @", exception)
            }
    
        }
        
    }
    
    @objc protocol JavaScriptSwiftDelegate: JSExport {
        func callSystemCamera()
        
        func showAlert(title: String, msg: String)
        
        func callWithDict(dict: [String: AnyObject])
        
        func jsCallObjcAndObjcCallJsWithDict(dict: [String: AnyObject])
    }
    
    @objc class JSObjCModel: NSObject, JavaScriptSwiftDelegate {
        weak var controller: UIViewController?
        weak var jsContext: JSContext?
        
        func callSystemCamera() {
            print("js call objc method: callSystemCamera");
            
            let jsFunc = self.jsContext?.objectForKeyedSubscript("jsFunc");
            jsFunc?.callWithArguments([]);
        }
        
        func showAlert(title: String, msg: String) {
            dispatch_async(dispatch_get_main_queue()) { () -> Void in
                let alert = UIAlertController(title: title, message: msg, preferredStyle: .Alert)
                alert.addAction(UIAlertAction(title: "ok", style: .Default, handler: nil))
                self.controller?.presentViewController(alert, animated: true, completion: nil)
            }
        }
        
        // JS调用了我们的方法
        func callWithDict(dict: [String : AnyObject]) {
            print("js call objc method: callWithDict, args: %@", dict)
        }
        
        // <span style="font-family: Arial, Helvetica, sans-serif;">JS调用了我们的方法</span>
        func jsCallObjcAndObjcCallJsWithDict(dict: [String : AnyObject]) {
            print("js call objc method: jsCallObjcAndObjcCallJsWithDict, args: %@", dict)
            
            let jsParamFunc = self.jsContext?.objectForKeyedSubscript("jsParamFunc");
            let dict = NSDictionary(dictionary: ["age": 18, "height": 168, "name": "lili"])
            jsParamFunc?.callWithArguments([dict])
        }
    }
    extension ViewController: NSURLConnectionDelegate,NSURLConnectionDataDelegate {
    
        func connection(connection: NSURLConnection, didReceiveData data: NSData) {
            print("didReceiveData\(data)")
        }
        
        func connection(connection: NSURLConnection, willSendRequest request: NSURLRequest, redirectResponse response: NSURLResponse?) -> NSURLRequest? {
            print("request:\(request)response:\(response)")
            return request
        }
        
        func connection(connection: NSURLConnection, didFailWithError error: NSError) {
            
        }
        
        
    }
    
    




    Demo代码:

    点击打开链接

    展开全文
  • 此资源为 swiftJavaScript 之间方法的相互调用,相互传值。
  • Swift WKWebView的swift调用js 不多说,直接上代码: [objc] view plain copy import UIKit  import WebKit  class SwiftCallJSController: UIViewController {    ...


    Swift WKWebView的swift调用js

    不多说,直接上代码:

    [objc] view plain copy
    1. import UIKit  
    2. import WebKit  
    3. class SwiftCallJSController: UIViewController {  
    4.   
    5.     var context = JSContext()  
    6.     var webView = WKWebView()  
    7.     override func viewDidLoad() {  
    8.         super.viewDidLoad()  
    9.         view.backgroundColor = .white  
    10.         //webView  
    11.         webView.frame = view.frame  
    12.         let config = WKWebViewConfiguration()  
    13.           
    14.         //偏好设置  
    15.         config.preferences = WKPreferences()  
    16.         //字体  
    17.         config.preferences.minimumFontSize = 10  
    18.         //设置js跳转  
    19.         config.preferences.javaScriptEnabled = true  
    20.         //不自动打开窗口  
    21.         config.preferences.javaScriptCanOpenWindowsAutomatically = false  
    22.         //web内容处理池  
    23.         config.processPool = WKProcessPool()  
    24.         //js和webview内容交互  
    25.         config.userContentController = WKUserContentController()  
    26.         //注入js对象名称为appmodel,当js通过appmodel来调用  
    27.         //可以在wkscriptMessagehandler的代理中接收到  
    28.         config.userContentController.add(self, name"AppModel")  
    29.           
    30.         //webView  
    31.         webView = WKWebView(frame: view.bounds, configuration: config)  
    32.         view.addSubview(webView)  
    33.         let url = Bundle.main.url(forResource: "JSCallOC", withExtension"html")  
    34.         webView.load(URLRequest(url:url!))  
    35.           
    36.         //swift操作js的按钮  
    37.         let button = UIButton.init()  
    38.         button.frame = CGRect(x:100,y:100,width:100,height:100)  
    39.         button.backgroundColor = .red  
    40.         button.addTarget(self, action: #selector(doButton), for.touchDown)  
    41.         view.addSubview(button)  
    42.     }  
    43.       
    44.     func doButton() {  
    45.         webView.evaluateJavaScript("log(10)") { (str, error) in  
    46.             if error != nil {  
    47.                 print("\(error)")  
    48.             } else {  
    49.                 print(str ?? "")  
    50.             }  
    51.         }  
    52.     }  
    53.       
    54.     func loadJsFile(name: String) -> String {  
    55.         let path = Bundle.main.path(forResource: name, ofType"js")  
    56.         let jsScript = try! String(contentsOfFile: path!, encoding: String.Encoding.utf8)  
    57.         return jsScript  
    58.     }  
    59. }  
    60.   
    61. extension SwiftCallJSController: WKScriptMessageHandler {  
    62.     func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {  
    63.         print(message.body)  
    64.     }  
    65. }  

    在html里面要添加的的代码,显示swift传过去的参数:

    [objc] view plain copy
    1. function log(n) {  
    2.         document.getElementById("result").innerText = n;  
    3.     }  

    这样就实现了Swiftjs传参数和调用!

    如果转载请注明转于:AirZilong的博客


    Swift WKWebView的js调用swift

    最近项目需求,需要用到JavaScriptCore和WebKit,但是网上的资源有限,而且比较杂,都是一个博客复制另外一个博客,都没有去实际敲代码验证,下面给大家分享一下我的学习过程。

    js调用Swift

    controller的代码:

    [objc] view plain copy
    1. import UIKit  
    2. import WebKit  
    3.   
    4. class JSCallSwiftController: UIViewController {  
    5.     var webView = WKWebView()  
    6.     override func viewDidLoad() {  
    7.         super.viewDidLoad()  
    8.         setWebView()  
    9.     }  
    10.     func setWebView() {  
    11.         webView.frame = view.frame  
    12.         let config = WKWebViewConfiguration()  
    13.           
    14.         //偏好设置  
    15.         config.preferences = WKPreferences()  
    16.         //字体  
    17.         config.preferences.minimumFontSize = 10  
    18.         //设置js跳转  
    19.         config.preferences.javaScriptEnabled = true  
    20.         //不自动打开窗口  
    21.         config.preferences.javaScriptCanOpenWindowsAutomatically = false  
    22.         //web内容处理池  
    23.         config.processPool = WKProcessPool()  
    24.         //js和webview内容交互  
    25.         config.userContentController = WKUserContentController()  
    26.         //注入js对象名称为appmodel,当js通过appmodel来调用  
    27.         //可以在wkscriptMessagehandler的代理中接收到  
    28.         config.userContentController.add(self, name"AppModel")  
    29.           
    30.         //webView  
    31.         webView = WKWebView(frame: view.bounds, configuration: config)  
    32.         view.addSubview(webView)  
    33.         let url = Bundle.main.url(forResource: "JSCallOC", withExtension"html")  
    34.         webView.load(URLRequest(url:url!))  
    35.     }  
    36. }  
    37.   
    38. extension JSCallSwiftController: WKNavigationDelegate {  
    39.       
    40. }  
    41.   
    42. extension JSCallSwiftController: WKScriptMessageHandler {  
    43.     func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {  
    44.         print(message.body)  
    45.     }  
    46. }  

    html里面要写入的代码:

    [objc] view plain copy
    1. function log(n) {  
    2.         window.webkit.messageHandlers.AppModel.postMessage({body:n})  
    3.     }  
    这样就很简单的实现了js调用swift的方法;

    如果转载请注明转于:AirZilong的博客


    展开全文
  • 1.首先创建一个代理方法继承JSExport里面实现的方法是js需要调用swift的方法@objc protocol JavaScriptSwiftDelegate: JSExport { func method(str:String) //带参数的 func method2()//不带参数 } 2.创建一个...
  • 最近项目需求,需要用到JavaScriptCore和WebKit,但是网上的资源有限,而且比较杂,都是一个博客复制...js调用swift controller的代码: import UIKit import WebKit class JSCallSwiftController: UIViewController {
  • SwiftJS交互

    2017-11-13 10:20:38
    swiftjs交互: 先看model: @objc protocol VideoDelegate : JSExport { func callSystemCamera(); func exitsCollection(cid: String); } @objc class OCModel: NSObject , VideoDelegate { va
  • 不多说,直接上代码: import UIKit import WebKit class SwiftCallJSController: UIViewController { var context = JSContext() var webView = WKWebView() override func viewDidLoad() { ...
  • Swift中加载HTML网页有两个view,分别是WKWebView和UIWebView,这里我使用的是WKWebView 这里分享一下我的写法: 1、定义变量WKWebView: lazy var webView: WKWebView = { ///偏好设置 let preferences = ...
  • swift3转swift5Swift 5 has released and is available with Xcode 10.2. Today we’ll be discussing what it brings to the table. Swift 5已发布,可用于Xcode 10.2。 今天,我们将讨论它带来的好处。 Swift 5...
  • JavaScript调用Swift原生方法 1、创建公开给JavaScript调用的方法类 2、导入JavaScriptCore库 3、关联JSContext 4、以 JSExport 协议关联 NativeObject对象的方法 5、实现JSMethodExport协议方法 ...
  • SwiftJS的简单交互
  • Apple在北京时间2014年6月3日凌晨发布了iOS8。这次更新在界面上看上去几乎没有修改,不过对于开发者,iOS8...本资源使用SWIFT实现了JS调用本地代码的2中方式,第二种方式是iOS8的新增SDK 本资源在XCode 6 beta 5中开发
  • 在上一篇中我们介绍了Swift下WKWebView的基本使用方法,下面总结一下iOS与js交互的实现,最终的页面效果如下图所示: 其中,js有关代码如下: function navButtonAction(name,age){ document....
  • 此篇参考自iOS开发 - Swift使用JavaScriptCore与JS交互 作者 :天秤vs永恒 实践通过 JavaScriotCore 来实现 SwiftJS 的交互。 复制代码 一、JavaScriptCore中的类 JSContext:JSContext是JS的执行环境,...
  • iOS 原生webView 与 JS 交互工具
  • swift - WKWebView JS 交互

    2017-09-13 17:54:30
    本文介绍WKWebView怎么与js交互,
  • 本文大致讲述在项目中 SwiftJavascript 如何相互调用,集成多个 Demo。快速上手 WebViewJavascriptBridge 框架。
  • SwiftJavaScript 的交互
1 2 3 4 5 ... 20
收藏数 18,878
精华内容 7,551
关键字:

swift 转js