详解 WWDC 20 SwiftUI 的重大改变及核心优势
6月23日凌晨 1 点,苹果 WWDC20 开发者大会在线上以主题演讲的方式,在 Apple Park 进行直播。
23-26日,苹果公开了 100 多个面向开发者的视频,内容涵盖Swift / SwiftUI 、App Clips、Widgets、Privacy & Security 等等方面。
对于开发者和程序员来说,我们有哪些新发现和新思考?
淘系技术客户端团队,将给大家带来一系列关于新系统背后的启发,欢迎交流讨论。
前言
还提供了 Rosetta2 Universal2 帮助开发者基本无成本的迁移到新平台上。但是作为软件工程师还是要更多的关注软件生态的变化。首先了解下创建 APP 时的变化
Before
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
var window: UIWindow?
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
let contentView = ContentView()
if let windowScene = scene as? UIWindowScene {
let window = UIWindow(windowScene: windowScene)
window.rootViewController = UIHostingController(rootView: contentView)
self.window = window
window.makeKeyAndVisible()
}
}
}
After
import SwiftUI
@main
struct MyApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
但最重要的变化是这是第一次跨平台代码,完全无需引入任何 UIKit APPKit WatckKit 等相关Framewok, 即可直接运行在不同平台上。这意味着我们后续在UI布局系统上可以逐渐摆脱对传统命令式 UI 编程的依赖。达到真正的平台无关。
▐ Preview
Xcode12 可以在 Canvas 上同时预览多个不同设备环境的界面,也可以直接投射到真实的设备上来预览。
▐ Xcode Library
但是对于一个大型的开发团队而言,一个开发同学是很难知道公司内到底有多少种组件库,而且即便知道有某种组件库,开发同学初期看到的也是代码,一般需要书写一定的 Demo 才可以用眼睛感知到这个组件到底是否是我想要的。
在 Xcode 12 中提供了更强大的工具,一个自定义组件,只需要遵守一个 LiberyContentProvider 协议就可被Xcode识别,可以像系统控件一样直接从 Xcode 里面识别并预览。对于一个大型团队来说,此功能可以大大提高找寻组件和查看组件样式的效率。
// Without trailing closure:
UIView.animate(withDuration: 0.3, animations: {
self.view.alpha = 0
}, completion: { _ in
self.view.removeFromSuperview()
})
// With trailing closure
UIView.animate(withDuration: 0.3, animations: {
self.view.alpha = 0
}) { _ in
self.view.removeFromSuperview()
}
// Multiple trailing closure arguments
UIView.animate(withDuration: 0.3) {
self.view.alpha = 0
} completion: { _ in
self.view.removeFromSuperview()
}
▐ Multiple Trailing Closures
// Without trailing closure:
UIView.animate(withDuration: 0.3, animations: {
self.view.alpha = 0
}, completion: { _ in
self.view.removeFromSuperview()
})
// With trailing closure
UIView.animate(withDuration: 0.3, animations: {
self.view.alpha = 0
}) { _ in
self.view.removeFromSuperview()
}
// Multiple trailing closure arguments
UIView.animate(withDuration: 0.3) {
self.view.alpha = 0
} completion: { _ in
self.view.removeFromSuperview()
}
▐ Switch Case Support
var body: some View {
switch c {
case .a:
return Text("A")
case .b:
return Text("B")
case .c:
return Text("C")
}
}
人脑处理状态的复杂度是有限的,状态的复杂度一旦超过人脑的复杂度,就会产生大量的 Bug,并且修掉了这个产生了新的Bug。
SceneStorage 和 APPStorgae 让一些可持久化的数据变得更加简单且具有语义化。
真正重要的是今年新增的各类新控件,其中通过导出来自 Xcode11.5 和 Xcode12.0 beta 版本的 Swift 声明文件,可以观察到整个声明文件从原来的 10769 行增加到 20564行。
新增了约 87 个 struct 16 个 protocol。有了这些丰富的组件才可以更好的构建我们的 APP 。
▐ 大列表组件
SwiftUI 2.0 推出了 LazyHStack 和 lazyVStack 加上 List 渲染模式默认就是 Lazy 的直接解决了最大的性能问题。
Widget and Clips
同理 Clips 也一样。这里因为篇幅原因就不做展开,后续会有专门的文章分析相关技术。
SwiftUI 又是 N 年后才可以用上的小玩意,Objective-C 不够用吗?现在笔者可以回答这些质疑的声音, Swift 未来的机会在 效率,体验和苹果的技术红利。
▐ 效率
但更进一步,如果编写 UI 界面从 UIKit 转向了 SwiftUI 代码量直接少了不止一倍。更少的代码意味着更快的交付,在目前竞争激烈的市场会有更多的试错场景。
▐ 体验
首先引入 Swift 后,由于 Swift 语言设计之初便对安全性列为最重要的目标,Swift的引入会让代码尽可能的减少未定义的行为,减少 Crash 意味着APP的稳定性提高,体验自然更佳。
更少的代码意味者更小的包大小,目前国内巨头 APP iOS 端 APP 包大小都朝着 200 MB 奔去,如果能减少更多的代码对包大小也可以在 200MB 的限制下承载更多而业务。对用户的体验也有较大的提升。
▐ 苹果的选择
从 WWDC17 后 苹果已经不再使用 Objective-C 做 Sample Code 演示
https://developer.apple.com/不再更新 Objective-C 相关的文档
WidgetKit 是 SwiftUI only。
App Clips 10M的包大小, SwiftUI 是最合适的框架
开源社区逐步放弃 Objecive-C 如 Lottie。
▐ 我们需要做些什么?
一套支持 Swift 二进制的研发环境
300+ 支持了混编的淘系 SDK。
手淘落地了 6 个模块。
集团新增了约 20个 支持 Swift 的APP。
10 多场技术培训。
169+ 语雀知识沉淀。
300+ 工程师的集团 Swift 官方组织。
2 个 技术创新产品
▐ 要朝什么方向去努力
升级基于 SPM 的新的包管理体系
升级老旧基础库,打磨新一代基建。
引入新的 Swift 特有库 赋能业务。
iOS 14 才可放心的使用。
只支持 Apple Platform,这和国内的要支持 Mobile Platform 从理念上冲突。
虽然可以看到 Swift 语言也在逐渐支持 Android 平台,但是也看到苹果对于安卓平台的 SwiftUI 并没有太大兴趣。
比起 Flutter 引入双端带来的包大小增量和体验不一致的情况, SwiftUI 保留 iOS 平台体验,只侵入一端的选择显然要更好一点。
MovieSwiftUI
SE-0281-main-attribute.md
Add custom views and modifiers to the Xcode Library
Structure your app for SwiftUI previews
Introduction to SwiftUI
What's new in SwiftUI
App essentials in SwiftUI
Visually edit SwiftUI views
Stacks, Grids, and Outlines in SwiftUI
Build document-based apps in SwiftUI
Data Essentials in SwiftUI
Build a SwiftUI view in Swift Playground
Build SwiftUI apps for tvOS
Build SwiftUI views for widgets
Build complications in SwiftUI
What's new in Swift
Swift packages: Resources and localization
Distribute binary frameworks as Swift packages
Explore logging in Swift
Create Swift Playgrounds content for iPad and Mac
Embrace Swift type inference
Explore numerical computing in Swift
Unsafe Swift
Safely manage pointers in Swift
Explore numerical computing in Swift [
Explore Packages and Projects with Xcode Playgrounds
Use Swift on AWS Lambda with Xcode
手淘客户端架构组
简历投递:qinghan.jy@alibaba-inc.com