什么是Swift
Swift
The powerful programming language that is also easy to learn.
历史
Objective-C,80年代初发明,依赖于 GCC 编译链,而开源的GCC,不会为了苹果去做优化,因此苹果把Chris Lattner(LLVM 框架,Clang 编译器的作者)招入麾下,把 GCC 的编译链先替换成 LLVM +GCC,又替换成 LLVM+Clang ,做语法简化、自动引用计数、增加 Blocks 和 GCD 多线程异步处理技术…… 终于,OC 在 30 年后重新焕发出勃勃生机,语言排名最高到第三。
但是,苹果却有点烦了,OC 改进了这么多年,怎么看都像是在修修补补,用 Blocks 去实现一个类似 Python 的 lambda 闭包功能,看起来总是那么别扭。好吧,既然已经全盘掌握了 LLVM 和 Clang,为什么我们不去基于现在的编译器设计一门全新的语言呢?一门属于苹果的语言!于是 Swift 诞生了……
Chris Lattner ,从2010年开始研发,WWDC 2014发布,用于 OS X 和 iOS 平台新的编程语言。
Swift 是一门博采众长的现代语言,在设计的过程中,克里斯参考了Objective-C,Rust,JS,Haskell,Ruby,Python,C# 等优秀语言的特点,最终形成了 Swift 的语法特性。
为什么现在要用 Swift
趋势
- 首先 Objective-C 已经不更新了。
- Swift 发布到 5.1,ABI 稳定。
- 很多OC的第三方库,已经不更新,新的系统可能出现bug或者适配问题
- AppStore 排名前 1000的App做分析,国内使用 Swift 的 APP 约占比 22%,美区使用 Swift 的 APP 约占比 78%,其中美区剩余没有使用 Swift的APP大部分来自中国地区本地化的产品,如抖音,快手等,可以得出一个结论,国内还是小众的 Swift,在国外已经是现状。
- WWDC 19 年发布了 4 个 Pure Swift 框架,无法简单的被 Objective-C 混编。
Swift 的优势
优势 | Swift |
---|---|
新特性 | 元组,闭包 ,泛型,命名空间 |
先进性 | Struct, enum更强大灵活,控制流更先进(if let 、 guard 、区间操作符、switch case任意类型) |
安全性 | 类型安全,禁止隐式转换,optional保护。 Swift 编译出来的包在逆向工厂和反编译中目前是属于比较困难的状态 |
包大小 | 编译后减少10% |
编码效率 | 代码更简短 |
性能 | 没有动态派发,函数调用速度更快,编译速度是OC 1.3倍 同时带来更高的安全性,函数不容易被动态修改 |
跨平台 | 支持 |
编程范式 | 面向协议编程,函数式编程,SwiftUI |
enum 类型灵活(switch case)
1 | enum Barcode { |
区间运算符
1 | for index in 0...5 { |
可选类型
Swift不仅对类型是否匹配有严格要求,还对一个类型是否有值格外严格。? ! ?? guard iflet 解包
1 | var a: String? |
对于上面两个变量a和b,虽然他们都是String类型的,但实际上他们是不一样的,a属于可选String类型,b是String类型。1
2
3
4
5
6
7
8
9
10// 确定不为空值的时候强制解包
print(a!)
// 不确定是不是空值的时候,进行可选绑定
if let aTemp = a {
print(a)
}
// 使用空合运算符保证在解包失败的时候有一个备选值
print(a ?? "0")
闭包
OC 定义闭包1
2
3@property (nonatomic, copy, nullability) returnType (^blockName)(parameterTypes);
typedef returnType (^TypeName)(parameterTypes);
Swift 定义闭包1
2var c = { ()->() in }
typealias TypeName = ((parameterTypes) -> Void)
Struct 与 Class 对比
Struct | Class | |
---|---|---|
优点 | 简单,快,可以深拷贝,真正的不变性,不会内存泄漏等 | 可继承,可以和OC语言一起用 |
类型 | 值类型 - value type-直接存在栈(stack)中 | 引用类型 - referenc type-在栈(stack)中存储的是它的引用地址(真正存在堆中) |
初始化 | 会自动默认生成一个成员变量初始化方法 | 必须要有一个初始化方法 |
拷贝 | 深拷贝 - 值拷贝 | 浅拷贝 - 只拷贝了一份引用,指向同一个内存地址 |
数据的不变性 | 数据的不变性–定义为let后,不可改变其中的属性 | 即使用let定义,仍旧可以随意改变其中的属性 |
面向协议开发POP
所谓面向协议编程,就是使用protocol声明方法,然后使用extension提供默认的实现,只要需要使用到该方法的类遵循该protocol,就可以直接使用该extension的实现。
OOP对比:类只能继承自其它一个类,但协议可以继承自多个协议。 并且面向对象方法,容易造成耦合。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28protocol animal {
var food: String {get}
func eat()
}
extension animal {
func eat() {
print("food name is \(food)")
}
}
struct Cat: animal {
var food: String = "mouse"
}
struct Dog:animal {
var food: String = "cat"
}
let cat = Cat()
let dog = Dog()
cat.eat()
dog.eat()
log:
food name is mouse
food name is cat
怎么做迁移
Swiftify
有一个比较好的自动化工具Swiftify,可以将OC文件甚至OC工程整个转成Swift,只用了免费版,很多地方需要手动修改,并且由于之前OC没有按照swift的特性, 只是语法转化显得不够理想。
与 OC 混编
通过桥接文件,import 相关类库,就可以在代码中实现混编。
SwiftLint
对于OC转Swift之后的语法变化还有很多细节值得注意,特别是对于初次使用Swift这门语言的同学,很容易遗漏或者待着OC的思想去写代码。这里推荐一个语法检查的框架SwiftLint,可以自动化的检查我们的代码是否符合Swift规范
其他扩展
开源
Swift 以开源形式在 Swift.org 上开发而成,其源代码、bug 跟踪器、论坛和常规开发版本将对所有人公开。在这个由众多开发者组成的广泛社区中,Apple 内部员工与成百上千位外部贡献者携手合作,让 Swift 愈加出色。该社区还会提供更多博客、播客、会议和聚会,让社区中的开发者分享有关如何发挥 Swift 巨大潜能的经验。
跨平台
Swift 已能够支持所有 Apple 平台和 Linux,社区成员正积极地努力将 Swift 移植到更多平台上。借助 SourceKit-LSP,社区成员还在努力将 Swift 支持集成到各种开发者工具中。我们非常期待看到 Swift 以更多元的方式构建更安全、更快速的软件,同时也让编程变得更有趣。
Swift for Sever
Swift 不仅能够为 Apple 平台开发很多新 app,而且还适用于一系列新的现代化服务器 app。Swift 非常适合用于需要运行时安全、编译性能和较小内存占用空间的服务器 app。为了把握使用 Swift 开发和部署服务器 app 的方向,Swift 社区成立了 Swift Server 工作组。该工作组为此而推出的首个产品为 SwiftNIO,这是一款跨平台的异步事件驱动型网络应用程序框架,适用于高性能协议服务器和客户端。它是构建其他面向服务器的工具和技术的基础,包括正在积极开发的日志记录、指标和数据库驱动程序。
swift for Tensorflow
swiftUI
swiftUI 采用声明式语法,与React,Flutter相似。UI 数据绑定,数据更新UI进行更新(类似 setData)
在 Xcode 中不仅仅可以通过代码改变实时预览,还可以通过编辑预览生成代码
SwiftUI 可以在 Xcode 里面直接切换 LiveMode 可以不运行设备直接进入交互模式,再具有多个预览设备时可以很方便的动态调试 UI 布局。
架构设计
将在后续文章中分析