WWDC2018-Swift更新了什么?
更新时间: 2018-6-6
WWDC2018 在昨天(6.5)凌晨开幕了, 本次大会主要针对 iOS、macOS、tvOS、watchOS 平台。作为开发者, 第一时间关注的是技术的更新。 昨天就升级到 iOS12 以及在 Mojave 上使用 Xcode10。 这段时间会陆陆续续更新。 这篇文章是关于昨晚的 What's new in Swift
值得一说: Swift5 得等2019年咯
Faster Swift Debug Builds
Xcode10 给人的第一印象就是 Build Faster,
官方的图片显示

在我实际测试之中, 编译速度真的提升很多。以前项目完全编译的情况需要大概10-20多分钟,这次仅仅花了4分多。而且迁移到 Swift4.2 几乎没有任何障碍。
Xcode10 增加了编译模式(Copilation Mode) 和 优化水平(Optimization Level)

编译模式(Copilation Mode):
- 增量更新(Incremental)
- 全量更新(Whole Module)
优化水平(Optimization Level):
- No optimization[-Onone]
- Optimize for Speed[-O]
- Optimize for Size[-Osize]
值得提一下的是: 如果你的 Optimization Level
设置为 Optimize for Size[-Osize]
, 代码体积减少10%~30%, 这样的代价就是 运行时性能降低5%左右
Small String
字符串的大小将变得更小小了, 在64位机器上, 字符串的编码使用16 bytes

语言新特性(New Language Features)
Swift 每个版本的新特性, 开发者可以通过 Github 或者 Swift Evolution 查看
1. 枚举集合(Derived Collection of Enum Cases)
在 Swift4.2之前, 我们遍历枚举值需要这样做
enum Gait {
case walk
case trot
case canter
case gallop
// 定义一个集合来存储所有的情况
static var allCases: [Gait] = [.walk, .trot, .canter, .gallop]
}
for gait in Gait.allCases {
print(gait)
}
如果我们添加、删除或者修改了一个 case
, 就需要在 allCases
进行对应的操作, 很麻烦。
Swift 4.2 新增了 CaseIterable
可以实现 allCases
效果。
enum Gait: CaseIterable {
case walk
case trot
case canter
case gallop
}
for gait in Gait.allCases {
print(gait)
}
延伸阅读: Handling Future Enum Cases
2. 条件一致性(Conditional conformances)
在 Swift 4.2 之前

Swift 4.2 之后, 可以对集合内的元素进行比较

let coins = [[1, 2], [3, 6], [4, 12]]
coins.contains([3, 6]) // true
官方视频中列出了这几种情况:
// Equatable
extension Optional: Equatable where Wrapped: Equatable {}
extension Array: Equatable where Element: Equatable {}
extension Dictionary: Equatable where Dictionary: Equatable {}
// Hashable
extension Optional: Hashable where Wrapped: Hashable {}
extension Array: Hashable where Element: Hashable {}
extension Dictionary: Hashable where Dictionary: Hashable {}
// Encodable
extension Optional: Encodable where Wrapped: Encodable {}
extension Array: Encodable where Element: Encodable {}
extension Dictionary: Encodable where Dictionary: Encodable {}
// Decodable
extension Optional: Decodable where Wrapped: Decodable {}
extension Array: Decodable where Element: Decodable {}
extension Dictionary: Decodable where Dictionary: Decodable {}
还有一个比较有意思的情况是: 条件一致性允许组合(Conditional conformances allow composition)
// Int is Hashable
// => Int? is Hashable
// => [Int?] is Hashable
3. Syntheszed Equatable and Hashable
这个新特性是在 Swift 4.1中实现的。
在 Swift4.1 之前, 如果要比较两个对象, 最简单的方式是遵循 Equatable
协议, 然后实现协议定义的方法.
struct Person: Equatable {
var name: String
var age: Int
}
func == (lhs: Person, rhs: Person) -> Bool {
return lhs.name == rhs.name && lhs.age == rhs.age
}
实际上 func == (lhs: Person, rhs: Person) -> Bool {}
在不同对象中, 都需要来实现。
在 Swift 4.1 之后,如果对象 存储型的属性
都是 Equatable
, 并且 对象是 Equatable
, 系统默认会为你实现 func == (lhs: Person, rhs: Person) -> Bool {}
这个方法, 对象属性进行一个个比较。
这种操作对 Hashable
也是合适的。 如果你的存储型属性是 Hashable
, 系统会默认为你实现 public var hashValue: Int { get }
struct Person: Equatable, Hashable {
var name: String
var age: Int
}
let p1 = Person(name: "xiaoming", age: 12)
let p2 = Person(name: "xiaoming", age: 12)
let p3 = Person(name: "xiaohong", age: 12)
let p4 = Person(name: "xiaoming", age: 15)
print(p1 == p2) // true
print(p1 == p3) // false
print(p3 == p4) // false
print(p1.hashValue == p2.hashValue) // true
print(p1.hashValue == p3.hashValue) // false
print(p3.hashValue == p4.hashValue) // false
print(p1.name.hashValue == p2.name.hashValue) // true
print(p1.age.hashValue == p3.age.hashValue) // true
print(p1.name.hashValue == p4.name.hashValue) // true
4. 散列增强(Hashable Enhancements)
Hashable
协议新增了一个方法
public protocol Hashable : Equatable {
public var hashValue: Int { get }
public func hash(into hasher: inout Hasher)
}
5.Random Number Generation
Github链接 [Swift Evolution链接]( https://apple.github.io/swift-evolution/#?search=0202


6.Adding a build configuration INport Test
7.Target environment platform condition
8. Implicitly Unwrapped Optionals
9. Enforcing Exclusive Access to Memory


Swift 语言的新特性其实都在 https://apple.github.io/swift-evolution/ 有列出, 开发者可以点击进去查看原文.
转载自:https://juejin.cn/post/6844903617304985608