作为一名在Swift中编写的iOS开发人员,我发现必须将使用Swift编写的相同代码与使用JavaScript编写的前端开发人员进行协调变得越来越烦人.在一个地方实现通用功能然后转换为JS会更加简洁,对吧?
我开始怀疑Swift to JS编译器是否可行?也许不是分享完整的代码,而是至少一些通用的常用功能.
我在网上找到了这个转发器:SwiftJS.可悲的是,这个并没有真正削减它.
以下代码:
let a = [1, 2] print(a.count)
Invalid Swift code
在演示中返回.这并不能增强信心.别担心选项或函数重载等更复杂的位.
我想开始一个转换器项目,但后来我意识到有很多陷阱.例如这段代码:
var a = [1, 2] var b = a b.append(3)
应该a
等于[1, 2]
和b
等于[1, 2, 3]
.在JavaScript中,两者[1, 2, 3]
都是通过引用传递而不是通过值传递.
是否可以编写一个合适的转换器?
任何两种图灵完整语言之间的转换器总是 可行的.这并不意味着它简单,实用或有价值.
至少,您可以保证Swift到JS的转换是可能的,因为您可以将Swift编译为x64机器代码,并使用JS反汇编程序/反编译器来生成JS.但是,生成的代码将非常糟糕JS.
要进行良好的转换,您需要考虑一种语言的所有复杂最佳实践,以及它们在另一种语言中的等价物.这是一项艰巨的任务,必须为你想要传播的任何两对语言做两次(每个方向一次).有一个原因,转发器是如此罕见,通常是垃圾.
人们不禁要问,编写Swift到JavaScript的转换器是否有意义,因为语言不会映射1:1.除了你提到的那些(例如inout参数或函数重载)之外,还有许多陷阱.已经有一些可行的替代方案,例如使用Haxe/Kotlin将其转换为JavaScript和Swift,或者使用Xamarin/React Native开发跨平台应用程序.
话虽这么说,两种语言共享许多共同的最佳实践,并且具有相当大的特征重叠(例如,闭包/为变量分配函数).我不认为有任何功能是不可能转移的,虽然一些结果代码可能会非常混乱.
使用例如Kotlin还有一个明显的优势 - 您可以获取现有的Swift项目并将其转换为JS,而无需事先决定在Kotlin中编写.它是您需要学习的一种语言.
我已经开始了一个带有实时预览的转换器项目,我认为这是对ShiftJS的改进.它确实会处理你提到的案例(包括按值传递数组/字典).
尽管如此,它还在进行中,因为我还没有开始实现对类的支持.该inout
参数是困扰我的事情之一,尽管可能存在(丑陋的)解决方案.
var a = 2 func incr(_ a: inout Int) { a += 1 } incr(&a)//a now equals 3
可以转化成类似的东西
var a = 2 function incr(a) { a.set(a.get() + 1) } incr({get: a => a, set: val => a = val})//a now equals 3!
怎么样的黑客!
是否有可能将1:1 Swift写入JS转换器?我倾向于是,但陪审团已经出局了 - 我很可能最终会遇到一个无法在JS中复制的功能.