苹果 WWDC 2023 公布了新的 Swift / SwiftUI 特性


苹果公司在 WWDC23 全球开发者大会上公开了 Swift 编程语言及其生态系统(如SwiftUI )的新特性。

值得注意的是,两者本身同属统一生态下,新特性和改进并不相互独立。

Swift 编程语言

If / let 和 switch 语句作为表达式

可以使用内联 if 语句

struct Account {
var balance: Double
}

let account = Account(balance: 500)

let status =
if account.balance < 0 { "debt" }
else if account.balance == 0 { "break even" }
else { "Profit" }

print("Your account is in \(status).")

同样可以使用 switch 语句

enum WeatherCondition {
case sunny
case cloudy
case rainy
}

let weather = WeatherCondition.sunny

let advice =
switch weather {
case .sunny: "Feeling hot!"
case .cloudy: "Oooooooh"
case .rainy: "Don't forget your rain jacket"
}

print("Today's advice: \(advice)")

改进的错误检测

struct ContentView: View {
enum Destination { case one, two }

var body: some View {
List {
NavigationLink(value: .one) { //In 5.9, Errors provide a more accurate diagnostic
Text("one")
}
NavigationLink(value: .two) {
Text("two")
}
}.navigationDestination(for: Destination.self) {
$0.view // Error occurs here in 5.7
}
}
}

值和类型参数包

Parameter Packs ,一种接受任意数量参数的函数的方法,使它们成为可变函数。此外,这些参数可以是不同的类型。参数包与泛型等概念相结合时,可以使代码更加灵活和可重用。

下面的示例来自苹果官方 swift 示例仓库:

struct Pair<First, Second> {
let first: First
let second: Second
init(_ first: First, _ second: Second) {
self.first = first
self.second = second
}
}

func makePairs<each First, each Second>(
firsts first: repeat each First,
seconds second: repeat each Second
) -> (repeat Pair<each First, each Second>) {
(repeat Pair(each first, each second))
}

let pairs = makePairs(firsts: 1, "hello", seconds: true, 1.0)
print(pairs)

Macros 宏指令

宏就像类型或函数一样是 API,可以在编译时生成重复代码,比如自定义 Codable 等模块,也可以集成进入 Swift Package 中。

Swift Data

不用自定义数据库,告别了复杂数据流,只需要一个 @Model 关键词。

 

文章无法一一介绍改动,感兴趣的朋友可以在 WWDC23 回放中查看完整视频,了解所有关于 Swift 改动的内容。

SwiftUI 的新东西

Data flow

SwiftUI 不再使用 Combine,而是使用新的 Observation 框架。 Observation 框架提供了 Observable 协议,必须使用它来允许 SwiftUI 订阅更改和更新视图。

今年的更新把重点放在了 @State 和 @Environment 上,其它的都用 Macro 解决了。这点可以大幅度了减轻代码中对于 EnvironmentState 和 ObjectState 的使用。

Animations 动画

SwiftUI 框架有新版本的 withAnimation 函数,允许提供动画完成处理程序。这是一个很好的补充,可以构建阶段性动画。

此外引入了新的 PhaseAnimator 视图,该视图迭代阶段序列,允许为每个阶段提供不同的动画,并在阶段发生变化时更新内容。另外还有 KeyframeAnimator 视图,允许使用关键帧动画。

struct AnimationExample: View {
@State private var value = false

var body: some View {
Text(verbatim: "Hello")
.scaleEffect(value ? 2 : 1)
.onTapGesture {
withAnimation {
value.toggle()
} completion: {
print("Animation have finished")
}
}
}
}

ScrollView 滚动视图

ScrollView 有一些更新,比如可以使用 scrollPosition 视图修饰符来观察内容偏移。

struct ContentView: View {
@State private var scrollPosition: Int? = 0

var body: some View {
ScrollView {
Button("Scroll") {
scrollPosition = 80
}

ForEach(1..<100, id: \.self) { number in
Text(verbatim: number.formatted())
}
.scrollTargetLayout()
}
.scrollPosition(id: $scrollPosition)
}
}

其次还可以使用 scrollTargetBehavior 视图修饰符更改滚动行为,它允许在滚动视图中启用分页。

Search 搜索

与搜索相关的视图修改器也有一些补充,例如可以以编程方式关注搜索字段。

struct ProductsView: View {
    @State private var store = Store()
    @State private var query = ""
    @State private var scope: Scope = .default
    
    var body: some View {
        List(store.products, id: \.self) { product in
            Text(verbatim: product)
        }
        .task {
            if store.products.isEmpty {
                await store.fetch()
            }
        }
        .searchable(text: $query, isPresented: .constant(true), prompt: "Query")
        .searchScopes($scope, activation: .onTextEntry) {
            Text(verbatim: scope.rawValue)
        }
    }
}

在上面的示例,可以使用可搜索视图修饰符的 isPresented 参数来显示/隐藏搜索字段,还可以使用 searchScopes 视图修饰符的激活参数来定义范围可见性的逻辑。

New gestures 新手势

新的 RotateGesture 和 MagnifyGesture 允许跟踪视图的旋转和放大。

struct RotateGestureView: View {
@State private var angle = Angle(degrees: 0.0)

var rotation: some Gesture {
RotateGesture()
.onChanged { value in
angle = value.rotation
}
}

var body: some View {
Rectangle()
.frame(width: 200, height: 200, alignment: .center)
.rotationEffect(angle)
.gesture(rotation)
}
}

 

WWDC 关于 SwiftUI 的演讲长达 34 分钟,文章无法一一介绍其改动,感兴趣的朋友可以在 WWDC23 官方回放中查看完整视频。

 

值得一提的是,watchOS 已全部用 SwiftUI 重写。可以看到诸如 NavigationSplitView 的应用,诸如半透明材质效果,右侧小边栏按钮,半透明 Tab 。


相關推薦

2023-06-08

是从 Windows 进入 Volumes。所有的底层,和 iOS App 一致,由 SwiftUI,RealityKit 和 ARKit 三个层级构成。 macOS 14 Sonoma 已发布预览版 交互式小组件 用户可将小组件直接置于桌面之上,并通过访问小组件图库轻松找到工具。 用户在

2023-06-08

是从 Windows 进入 Volumes。所有的底层,和 iOS App 一致,由 SwiftUI,RealityKit 和 ARKit 三个层级构成。 visionOS 的三维界面使应用程序摆脱了传统显示器的边界限制,使它们可以以不同的比例并排出现。用户界面能够动态响应自然光

2023-06-14

自从苹果开始将 Mac 的处理器从英特尔转向 Apple Silicon 之后,大家都已经见识到 Apple Silicon 的实力了。M1 和 M2 系列的处理器相比以往的英特尔处理器,在 CPU、GPU 方面都有了巨大的性能提升,尤其是功耗比,更是无人能及。 抛

2023-06-30

语言。正如开发者现在可以要求 ChatGPT 使用 AppleScript 或 SwiftUI 等语言编写应用程序一样,无论他们使用哪种语言,都可以使用这个 ML 系统。

2023-06-07

苹果公司在 WWDC 2023 发布了旗下的操作系统更新,比如 macOS Sonoma、 iOS 17 、watchOS 10 和 iPadOS 17 等。 其中 iOS 17 的更新主要包括几个方面,新的通信功能、新的输入功能、新的共享功能以及一些新的稀奇古怪的功能。 通信功能主

2023-06-07

在今天凌晨举办的 WWDC 2023 上,苹果发布了其下一代 macOS —— macOS 14 Sonoma。 macOS 14 Sonoma 带来的各种新功能相信大家已经通过其他各大媒体有所了解。不过有一个值得关注的变化,苹果在发布会上只字未提,仅出现在 PPT 中的

2022-02-23

人 Chris Lattner 将离开核心团队。Chris Lattner 早在 2010 年在苹果公司工作期间就已经开始开发 Swift 编程语言了,不过他已经在 5 年前离开了苹果。 核心团队目前正在研究重组项目的领导层,以便为社区成员提供更多的途径来积

2023-05-04

Foundation 发布了首个 Preview 预览版。 Foundation 框架是苹果 macOS 和 iOS 的基础组件支持核心,几乎所有的 Swift 项目都使用 Foundation 框架,其主要包含了大量常用的 API,为许多基本功能提供了一个基础层,也为编写优秀的 Swift

2023-06-14

在上周的 WWDC 2023 上,苹果 “偷偷摸摸” 地为新版本的 Safari 浏览器带来了 JPEG XL 格式的支持。之所以说是 “偷偷摸摸”,是因为苹果在发布会上只字未提,这个功能仅仅出现在 PPT 中的一个角落中。 不过苹果在发布会结束

2024-04-16

彭博社记者 Mark Gurman 报道称,苹果计划为 iOS 18 推出的首批 AI 功能将完全在端侧上运行,不依赖云服务器。 iOS 18 预计不会包含苹果自己的类 ChatGPT 的聊天机器人,但目前还不清楚 Gemini 或其他聊天机器人是否会直接集成到 iOS 1

2022-12-16

Foundation 框架是苹果 macOS 和 iOS 的基础组件支持核心,几乎所有的 Swift 项目都使用 Foundation 框架,其主要包含了大量常用的 API,为许多基本功能提供了一个基础层,也为编写优秀的 Swift 代码奠定了基础。 swift-corelibs-foundation 项

2023-09-20

苹果今天凌晨正式推送iOS 17 正式版更新,其内部版本号和上周 RC 版本相同,均为 21A329。 在全新的 iOS 17 系统中,苹果加入了待机显示功能,为充电时将iPhone横屏放置带来了焕然一新的全屏体验,不用靠近,信息也能一目了然

2022-11-25

孵化语言提案以提高与 C++ 的互操作性 根据介绍,这些新的工作组加入了长期存在的 Swift on Server 和 Diversity 工作组,使感兴趣的用户可以更有针对性的加入专门的工作组来做出贡献。核心团队正在研究创建更多的工作组,包

2023-01-19

AFNetworking 是一个适用于苹果旗下多个操作系统网络框架(iOS、macOS、watchOS 和 tvOS ),是开发中不可缺少的组件之一。 它建立在 Foundation URL Loading System 之上,扩展了 Cocoa 中内置的强大的高级网络抽象。它有一个模块化的架构,