Swift,路在何方?

1,876 阅读5分钟
原文链接: zhuanlan.zhihu.com
昨天看到一则新闻,Swift编程语言的负责人Chris Lattner加入了Tesla,这在iOS开发者社区掀起了一阵波澜,大家不禁纷纷猜想Swift语言以后的发展会受到怎样的影响。

无论如何,自从2014年6月在WWDC亮相以来,Swift的发展还是有目共睹的:不仅在语法特性和API规范上不断改进,而且还在2015年开源并支持Linux平台。下图是objective-c和Swift的TIOBE编程语言指数趋势对比,Swift稳步上升,而objective-c则是大步下滑,这说明Swift语言在这两年的推广和采用还是相对比较成功的。

那么Swift究竟好在哪里?作为一个2014年亮相的语言,Swift吸收了很多好的编程语言的特性。强类型,类型推断,多范式,面向对象。。。个人最喜欢的一点是Swift被设计为多范式编程语言:既有命令式编程所需要的特性(mutable变量以及类似C的算符以及控制声明),又有丰富的函数式编程的算子。同时,Swift又支持通用编程,即可以使用类型参数来定义通用的类和接口。那么无论你是来自C, Java还是Scala背景, 都可以很快的上手这门语言。(当然,对于大型复杂的项目来讲,编程范式还是统一为好。这里只探讨上手难度)

以下是经典算法快速排序用命令式和函数式在Swift下的分别实现,举这个例子主要是想说明Swift的多范式特性(注意体会Swift对mutable变量的处理)

func quickSort(array: [Int]) -> [Int] {
    if array.count <= 1 {
        return array
    } else {
        let pivot = array[array.count / 2]
        let left = quickSort(array: array.filter({$0 < pivot}))
        let right = quickSort(array: array.filter({$0 > pivot}))
        return left + [pivot] + right
    }
}
func quickSortImperative(mutableArray: inout [Int], l: Int, r: Int) {
    if r <= l {
        return
    }

    let pivot = mutableArray[(l + r) / 2]
    var i = l
    var j = r

    while (i <= j) {

        while (mutableArray[i] < pivot) {
            i += 1
        }
        while (mutableArray[j] > pivot) {
            j -= 1
        }
        if (i <= j) {
            let t = mutableArray[i]
            mutableArray[i] = mutableArray[j]
            mutableArray[j] = t
            i += 1
            j -= 1
        }
    }
    if (l < j) {
        quickSortImperative(mutableArray: &mutableArray, l: l, r: j)
    }
    if (i < r) {
        quickSortImperative(mutableArray: &mutableArray, l: i, r: r)
    }
}

类型变量,熟悉Java或者C++模版的开发者应该对这个不陌生:

func findIndex<T: Equatable>(of valueToFind: T, in array:[T]) -> Int? {
    for (index, value) in array.enumerated() {
        if value == valueToFind {
            return index
        }
    }
    return nil
}

Optional类型直接用问号表示,使用非常方便

class Person {
    var residence: Residence?
}

使用Extension不仅可以较好的分隔臃肿类的功能,还能扩展已经封装好的类型

extension Double {
    var km: Double { return self * 1_000.0 }
    var m: Double { return self }
    var cm: Double { return self / 100.0 }
    var mm: Double { return self / 1_000.0 }
    var ft: Double { return self / 3.28084 }
}

感兴趣的同学可以利用Xcode的Playground自行体会Swift语言的特点,这里不再赘述。

此外,Swift的兼容性也没有太让人失望,可以使用任意objective-c的库。而用Swift写的库也是有办法被objective-c项目调用的。而Swift语言开源后不久后,出现了基于Swift的服务器框架,例如IBM的Kitura, Perfect,这使得对Swift有了更广阔的发展前景。

不过,凡事都有两面,当越来越多的开发者开始采用Swift的时候,吐槽Swift的人也开始越来越多,这主要集中在工具链并不是很好用,主要的来说有这几点:IDE索引变慢,IDE索引不稳定,build过慢/不稳定,e。

(是的你没看错,编译器自己segmentation fault了)

(Xcode在索引swift代码中途崩溃,秒成记事本)

这些问题使得Swift的开发体验并没有想象的那么好,尤其是中型或者大型项目,IDE索引故障会严重影响阅读代码和开发代码的速度。而编译器时不时的故障则直接要让本来就加班加点辛勤工作的程序员吐血了。网上吐槽Swift编译器的帖子则是随处可见:

(居然有人整理出一个github repo来收集所有能让Swift编译器出故障的例子)


(对于Swift build时间的优化,大家也是拼了。。)

更有甚者(我前雇主的一位非常资深的mobile工程师负责人)开始质问,苹果,你自己的app为何不用Swift?你难道就让我们这些不幸踩坑的公司给你测试报bug?而据他实测,苹果只有5个app用了Swift开发,分别是:WWDC,Music,Swift Playground,Apple Store, Calculator。这些app要么就是比较简单,要么就是使用很低频,这不禁使人们质疑,苹果为什么连自己的语言都用得这么少?这还如何让人放心地用Swift开发重要或者大型的项目?

总之,关于Swift的争论也一直没有停过,大家一定程度还是相信Swift可以成为未来iOS的主流,然而又对Swift现有的缺点非常厌恶。开发体验的问题使得大的项目负责人在选择Swift之前也会有许多顾虑,例如开发效率受到开发环境和编译速度的制约,以及语言和工具链的不稳定性会导致额外的开发周期,在这个产品迭代速度飞快的时代,Swift似乎让很多人望而却步了。

Swift,前路在何方?