Date Notes Swift Xcode
2017-07-02 首次提交 4.0 beta 9.0 beta

WWDC 2017 是苹果开发者大会的 2017 版,今年的更新很多,而且涉及多种平台,开发工具,以及 Swift 语言本身。102 这场演讲涉及了新系统以及新工具中的 features,但没有过多深入。因为后续还有更加独立的 Session 可供我们学习,查看,所以本文仅涉及本人认为需要的内容。关于 Metal 2 和 VR 距离我个人能力所及较远,本文也没有提及。

macOS

  • macOS High Sierra 将是最后一个支持 32 位程序的 macOS 版本。
  • App Store 64 位 App: 2018.01 新 App 务必支持;2018.07 所有 App 务必支持。

Playground 2.0

  • 将集成 API 文档,且支持 AR。

Xcode 9

  • 支持 Swift,Objective-C,C/C++ 重构。
  • 构建速度加快,打包后体积更小。

String

  • String 在 Swift 4.0 中已改为集合类型(Collection)。
// String 是 Character 的集合
var s = "Hello!"
for c in s {
    print(c)
}

s.last == "!"
s.index(of: "!")

s.dropLast() + " world!"

// 多行字符串字面量
let html = """
<!DOCTYPE html>
<html lang="zh-CN">
    <head>
        <title>Demo</title>
    </head>
    <body>
        <h1>Test multi-line string literals.</h1>
    </body>
</html>
"""

let gtIndex = html.index(of: ">")!
let substring = html[...gtIndex]

// Unicode 9 Grapheme Breaking
"👩‍👩‍👧‍👦".count == 1

Codable

// Codable 是 Decodable & Encodable 的别名
// A type that can convert itself into and out of an external representation.
// public typealias Codable = Decodable & Encodable

struct Location: Codable {
    var latitude: Double
    var longitude: Double
}

enum Animal: Int, Codable {
    case cow = 0
    case dog = 1
    case chicken = 2
}

struct Farm: Codable {
    let name: String
    let location: Location
    let animals: [Animal]
}

let farm = Farm(name: "Kingcos' Farm",
                location: Location(latitude: 1.0,
                                   longitude: 1.0),
                animals: [.cow, .dog, .chicken])

// -> JSON
let payload: Data = try JSONEncoder().encode(farm)
print(String(data: payload, encoding: .utf8) ?? "nil")

// JSON ->
let farmFromJSON = try JSONDecoder().decode(Farm.self, from: payload)
farmFromJSON.location.latitude

Swift 3.2 vs Swift 4.0

  • Swift 3.2 兼容旧项目,不需要修改即可构建。
  • Swift 3.2 不包含 Swift 4.0 中对现有 API 的改进。

Drag & Drop

  • 此处代码摘自视频,未经测试。
// Begin Drag
let dragData = self.data(at: sourceIndexPath)
let itemProvider = NSItemProvider(object: dragData)
return [UIDragItem(itemProvider: itemProvider)]

// Perform Drop
coordinator.session.loadObjects(ofClass: MyDataType.self) { (data) in
    self.insertData(data, at: destinationIndexPath)
    collectionView.reeloadSections(IndexSet(integer: 0)) 
    }

Large Titles

  • 此处代码摘自视频,未经测试。
// Adopt Large Titles
navigationBar.prefesLargeTitles = true

// Automatically Choose Large Title
navigationItem.largeTitleDisplayMode = .automatic

// Adopt Unified Search Bar
navigationItem.searchController = searchController

HEVC & HEIF

  • 新的视频和图片压缩编码标准。
  • 此处代码摘自视频,未经测试。
// 在不支持新标准的平台播放可加入以下判断
var asset = AVAsset(url: URL(fileURLWithPath: "hevc.mov"))
if !asset.isPlayable {
    asset = AVAsset(url: URL(fileURLWithPath: "h264.mov"))
}


let url = URL(string: "")!
CIImage(contentsOf: url, options: [kCIImageAuxiliaryDepth: true])

Machine Learning

Machine Learning

ARKit

ARKit

Reference