Foundation 框架的新亮点

WWDC 2019 Session 723 - Advances in Foundation

## 有序集合的 Diff

Foudation 框架为有序集合添加了 Diff 能力，用非常简单的方式，就能比对两个集合的差异，也能将差异应用到集合上。

let bird = "bird"
let bear = "bear"

let diff = bird.difference(from: bear)
let newBird = bear.applying(diff) // "bird"

## Data

### 连续性

#### Data 是连续的

public protocol ContiguousBytes {
func withUnsafeBytes<R>(_ body: (UnsafeRawBufferPointer) throws -> R) rethrows -> R
}

#### 通用数据协议

public protocol DataProtocol : RandomAccessCollection where Self.Element == UInt8, Self.SubSequence : DataProtocol {

associatedtype Regions : BidirectionalCollection where Self.Regions.Element : ContiguousBytes, Self.Regions.Element : DataProtocol, Self.Regions.Element.SubSequence : ContiguousBytes

var regions: Self.Regions { get }

func firstRange<D, R>(of: D, in: R) -> Range<Self.Index>? where D : DataProtocol, R : RangeExpression, Self.Index == R.Bound

func lastRange<D, R>(of: D, in: R) -> Range<Self.Index>? where D : DataProtocol, R : RangeExpression, Self.Index == R.Bound

func copyBytes(to: UnsafeMutableRawBufferPointer, count: Int) -> Int

func copyBytes<DestinationType>(to: UnsafeMutableBufferPointer<DestinationType>, count: Int) -> Int

func copyBytes<R>(to: UnsafeMutableRawBufferPointer, from: R) -> Int where R : RangeExpression, Self.Index == R.Bound

func copyBytes<DestinationType, R>(to: UnsafeMutableBufferPointer<DestinationType>, from: R) -> Int where R : RangeExpression, Self.Index == R.Bound
}

public protocol MutableDataProtocol : DataProtocol, MutableCollection, RangeReplaceableCollection {

mutating func resetBytes<R>(in range: R) where R : RangeExpression, Self.Index == R.Bound
}

• Foundation 框架：Data
• Swift 标准库里的：[UInt 8]
• GCD：DispatchData

### 压缩

let data = // ...数据
let compressed = try data.compressed(using: .lzfse)

• lzfse
• lz4
• lzma
• zlib

## Units

Unit 是 Foundation 框架在 iOS 10/macOS 10.12 新增的抽象类型，用于表示现实中使用的度量单位。具体介绍可以参考这篇文章

### 时间（UnitDuration）

• milliseconds：毫秒
• microseconds：微秒
• nanoseconds：纳秒
• picoseconds：皮秒

### 频率（UnitFrequency）

• framesPerSecond：FPS，每秒帧数

### 存储（UnitInformationStorage）

• 拥有 bits（位）、bytes（字节）、nibbles(半字节)这三种基本单位
• 拥有带有 SI-前缀(国际单位制，都是1000整数次幂)、二进制前缀(1024 整数次幂)和基本单位组合的单位(比如 KB、GB、TB)
• 支持使用 MeasurementFormatterByteCountFormatter 进行格式化

## Formatter

### 相对日期时间格式（RelateiveDateTimeFormatter）

let aDate = // ...两周前
let formatter = RelativeDateTimeFormatter()
let dateString = formatter.localizedString(for: aDate, relativeTo: Date())

// en_US: "2 weeks ago"
// zh_CN: "2 周前"

### 列表格式（ListFormatter）

`swift
let string = ListFormatter.localizedString(byJoining: ["😀","😳","😢"])