如何將JavaScript轉化成Swift?(二)

如何將JavaScript轉化成Swift?(一)swift

如何將JavaScript轉化成Swift?(二)數組

目前已經實現的效果

昨天讓同事隨意寫了一段JavaSCript代碼:bash

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文件:post

class NamesexageModel: NSObject { 
  var name: String
  var sex: Int
  var age: Int
}
複製代碼

從效果來看感受還能夠。。。ui

For 循環翻譯

上篇文章中沒有涉及 for 循環的翻譯,這裏補充一下:spa

JavaScriptFor寫法和Swift中的差別比較大,主要是由於Javascript 中的 Array 並不像大部分其餘語言的數組。首先, Javascript 中的 Array 在內存上並不連續,其次, Array 的索引並非指偏移量。實際上,Array 的索引也不是 Number 類型,而是 String 類型的。咱們能夠正確使用如 array[0] 的寫法的緣由是語言能夠自動將 Number 類型的0轉換成 String 類型的 「0」翻譯

C 風格的 for 循環

這種寫法應該是JavaScript中用的最多的code

for (let index = 0; index < array.length; index++) {
    console.log(array[index]);
}
複製代碼

可是Swift自從Swift3.0開始再也不支持C-Type的寫法,這就有點蛋疼了orm

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......

未完待續。。。

相關文章
相關標籤/搜索