如何將JavaScript轉化成Swift?(一)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 循環
的翻譯,這裏補充一下:spa
JavaScript
的For
寫法和Swift
中的差別比較大,主要是由於Javascript
中的 Array
並不像大部分其餘語言的數組。首先, Javascript
中的 Array
在內存上並不連續,其次, Array
的索引並非指偏移量。實際上,Array
的索引也不是 Number
類型,而是 String
類型的。咱們能夠正確使用如 array[0]
的寫法的緣由是語言能夠自動將 Number
類型的0
轉換成 String
類型的 「0」
翻譯
這種寫法應該是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(')');
}
複製代碼
for (index in array) {
console.log(array[index]);
}
複製代碼
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
的網絡請求,因爲 JavaScript
、Swift
都有各自的網絡請求庫,這裏須要統一方法名、參數,每一個語言也須要封裝各自的網絡請求庫;其次,Swift
的JSON
解析須要一個ClassModel,這裏須要將 JSON
轉 Swift Model Class......
未完待續。。。