What's New In Xcode16

Edit

Code Completion

它提供更全面的代码建议,并使用周围的代码上下文,如函数名称和注释。

使用条件: Xcode 16, macOS Sequoia

在中国境内购买的mac 不可用此功能

Swift 6 Updates

Swift 6 新的语言模式提供了针对并发安全的保证。它将数据竞争转换为运行时问题。并提供语言特性的警告。

启用特定特性的警告

  • 在项目设置中,找到 Swift 编译器的设置选项。
  • 启用与特定语言特性相关的警告选项。

解决警告

  • 编译代码,并检查编译器发出的警告信息。
  • 逐个解决这些警告,以确保代码兼容新特性并符合并发安全要求。

测试和验证

  • 在解决警告后,运行项目的测试用例,验证代码的正确性和稳定性。
  • 确保所有并发操作都符合新的安全标准,避免数据竞争问题。

Preview

提供了两个新的 API 用于预览改进

@Previewable Macro

它将像 State 一样附加属性包装器,并允许我们直接在预览块中使用它。无需编写包装器视图。

通过上面代码可以看到:

以前使用 #Preview 宏时,无法定义本地状态变量;而使用Previewable 标记变量即可在 SwiftUI 预览中使用动态属性。

PreviewModifier

previewModifier的引入让预览的环境或数据共享变得更加简单。这不仅减少了重复代码,还帮助预览系统缓存数据,提高开发效率。通过previewModifier,我们可以在预览期间应用特定的修改器,这些修改器仅在预览中生效,而不会影响实际运行时的视图。

swift 复制代码
@Observable
class ModelContainer {
    var snacks: [String] = []
}

struct SnackView: View {
    @Environment(ModelContainer.self) private var container

    var body: some View {
        Text(container.snacks.first ?? "no data")
            .padding()
            .background(Color.yellow)
            .cornerRadius(8)
    }
}

Old Preview

swift 复制代码
#Preview("Old") {
    SnackView()
        .environment(ModelContainer())
}

PreviewModifier

swift 复制代码
// 实现 PreviewModifier 协议来定义共享的数据环境
struct SampleData: PreviewModifier {
    typealias Context = ModelContainer // Context 定义为 ModelContainer

    // 创建共享的数据环境
    static func makeSharedContext() async throws -> ModelContainer {
        let container = ModelContainer()
        container.snacks = [
            "Potato Chips",
            "Chocolate",
            "Popcorn"
        ]
        return container
    }

    // 在预览中应用共享的数据环境到视图
    func body(content: Content, context: ModelContainer) -> some View {
        content.environment(context)
    }
}

extension PreviewTrait where T == Preview.ViewTraits {
    @MainActor static var sampleNamer: Self = .modifier(SampleData())
}

#Preview("New in Xcode 16", traits: .sampleNamer, body: {
    SnackView()
})

对比结果

Builder

Xcode 16 将提供显式模块,从而改善并行性、优化诊断和加快调试速度。Objective-C 将默认提供显式模块,但在 Swift 中,你需要在构建设置中启用显式构建模块选项。

在 Xcode 16 中,Swift Package 集成有所改进,我们可以在不必等待包解析完成的情况下,排队更新构建。

使用显式模块。Xcode将每个编译单元的处理分为三个独立的阶段。正在扫描,构建模块,最后构建原始代码。

其中前两个阶段在构建日志中显示为扫描依赖项编译 clang 模块或编译 Swift 模块命令。以前,这些操作是作为编译源文件的一部分隐式执行的。现在您可以获得更详细的构建细目。如果由于模块问题导致构建失败,错误信息更清晰。

Debug

  1. 在构建适配 macOS Sequoia 或 iOS 18 的项目时,默认调试符号格式为 DWARF5这使得 dSYM 捆绑包更小,符号查找速度更快
  2. 在 Xcode 16 中调试代码时,线程性能检查器更加强大。 主线程卡顿时,我们可以在调试 工具栏 中启用统一的回溯视图。这将有助于可视化调用堆栈并找出卡顿问题。

通过在调试 工具栏 中启用回溯图, 可以很形象的看出程序调用堆栈,只需要往下滑动,即可看到每一堆栈信息以及数据信息

  1. 磁盘写入诊断:我们可以看到问题对不同应用版本的影响已经发生了变化。

现在,在管理器中,您可以看到问题的影响在应用程序的不同版本中是如何变化的。当您进入磁盘权限视图时,您可以看到某些签名旁边有向上的箭头。这些箭头是帮助您开始优先处理对用户影响最大的问题的好地方。

  1. 启动诊断:在组织者中将新增一个分类,用于检查应用的启动诊断日志。Xcode 将展示导致应用启动耗时的最慢代码段。

如果您的应用在客户设备上启动需要很长时间,xcode会向您显示最慢的的代码路径,签名。以便您可以优先解决影响最大的问题。

  1. 通过新的 RealityKit 调试器,我们可以捕获运行中应用的实体层次结构,并直接在 Xcode 中探索 3D 环境。

    1. Break into the RealityKit debugger - WWDC24 - Videos - Apple Developer
    2. Run, Break, Inspect: Explore effective debugging in LLDB - WWDC24 - Videos - Apple Developer

Test

使用 SwiftTesting 框架,我们可以通过展开结果来检查测试失败的详细描述。

  1. Meet Swift Testing - WWDC24 - Videos - Apple Developer
  2. Go further with Swift Testing - WWDC24 - Videos - Apple Developer

通过给测试用例添加标签来给测试用例分组

同时可以通过标签来测试某一组测试用例或者排除某一组测试用例

Profile

Instrument 16 新增的火焰图将提供跟踪执行的高级概述。

Other

Asset management

  • 在 Xcode 16 中,我们可以为 iOS 添加新的深色和着色的应用程序图标。iOS 和 iPadOS 支持三种样式的应用程序图标:浅色、深色和着色。

Device and simulators

  • 升级后的模拟器可以为 Vision OS 提供FaceTimeSharePlay支持。

Localization Enhancements

  • Xcode 16 为字符串目录提供了新功能,例如内联诊断和将字符串标记为不翻译的功能。

Reference document:

  1. developer.apple.com/cn/videos/p...
相关推荐
一如初夏丿2 天前
xcode15 报错 does not contain ‘libarclite‘
ios·xcode
app开发工程师V帅2 天前
Xcode 文件缺失:Missing submodule xxx
ide·macos·xcode
app开发工程师V帅2 天前
Xcode 16 编译弹窗问题、编译通过无法,编译通过打包等问题汇总
macos·xcode
请叫我飞哥@5 天前
iOS在项目中设置 Dev、Staging 和 Prod 三个不同的环境
ios·xcode·swift
B.-6 天前
减少 Flutter 应用体积的常用方法
学习·flutter·android studio·xcode
名字不要太长 像我这样就好8 天前
【iOS】OC语法知识小结
ios·cocoa·xcode
zhangfang688 天前
Go 语言切片(Slice)
开发语言·golang·xcode
davidson14719 天前
Xcode
ios·swiftui·xcode·swift·apple
tealcwu10 天前
【Unity踩坑】Unity生成iOS的XCode项目时提示错误:xcrun: error: SDK “iphoneos“ cannot be located
unity·ios·xcode
望天hous10 天前
go 怎么判断一个文件存在,并且如果存在则读取文件,并json反序列化 string切片
golang·json·xcode