Xcode 13.3 Beta 新特性及 Swift 新特性盘点

知识小集

共 3458字,需浏览 7分钟

 · 2022-02-15

Xcode 13.3 目前已发布了两个 beta 版本,beta 2 于本月 8 号发布。不过 beta 2 主要是对一些问题的修复,新特性不多。Swift 在这个版本中也新增了几个特性,以下是对 Xcode 13.3 中新特性的提取。

构建系统

构建系统和 Swift 编译器有一种新模式,可以更好地利用可用内核,从而加快 Swift 项目的构建速度。该模式是可选的,您可以使用以下用户默认值全局启用它:


defaults write com.apple.dt.XCBuild EnableSwiftBuildSystemIntegration 1

调试

在关闭优化的情况下进行编译时,Swift 编译器和 Clang 不再消除 ARM64 目标上的冗余分支指令。这通过启用更多断点位置来提高可调试性,但在使用 -Onone 编译时会产生稍大的二进制文件。

文档

Xcode 现在可以在可执行目标(如应用程序和命令行工具)中从您的 Swift 代码构建文档。

Instruments

  • 提高了 Instruments、Xcode 的内存图调试器和泄漏命令行中泄漏扫描的准确性。系统现在可以更准确地扫描多负载枚举案例中的对象引用,从而实现更精确的内存泄漏分析以及强、弱和无主引用类型的识别。

  • xctrace 现在能够使用用户指定的 dSYM 符号化以前捕获的跟踪文件。有关详细信息和语法示例,请参阅 man xctrace 或 xctrace 帮助符号。

  • Instruments 现在对应用程序启动的影响较小,使用 App Launch 模板收集的指标更能代表其实际行为。 

  • atos 现在允许在提供 -offset 标志或未指定加载地址或幻灯片的情况下以二进制偏移量的形式表示地址。

例如:


atos -arch arm64 -o Example.app/Contents/MacOS/Example 0x00fdae30


  • Instruments 从跟踪文档中删除了控制台视图。要在跟踪期间查看输出和错误,请从库中添加 stdout/stderr 工具。新的 stdout/stderr 工具提高了性能和可靠性,但默认情况下不再处于活动状态。

  • Instruments 现在在工具栏弹出窗口中显示运行问题,而不是在详细信息区域中显示它们。此外,运行问题也会出现在时间线上方的标尺中,以指示它们发生的时间。

Organizer

如果您有 10 个或更少的应用程序并且您之前没有订阅任何应用程序,Xcode 现在会自动向您发送应用程序的 Smart Insights 通知。要激活此功能,请单击“回归”项目或管理器中的任何“度量”项目。

源代码编辑器

  • 代码完成现在建议 if case .. 的枚举实例

  • 完成不可访问的符号时,代码完成不再自动导入模块。

StoreKit

  • 在 StoreKit 配置文件中,您现在可以复制、粘贴和复制产品、订阅组、订阅优惠和本地化。

  • 在 Xcode 中使用 StoreKit 测试时,您现在可以在 StoreKit 配置文件中为代码配置报价。在运行 iOS 15.4 或更高版本的设备上进行测试时,您可以兑换这些优惠。

  • 您现在可以在 StoreKit 配置文件中切换一种新模式,称为续订时计费重试。当订阅设置为续订时,此模式会导致订阅进入模拟的计费重试期。此模式适用于运行 iOS 15.4、macOS Monterey 12.3、watchOS 8.5 或 tvOS 15.4 的设备和模拟器。

  • 您现在可以在运行 iOS 15.4、macOS Monterey 12.3、watchOS 8.5 和 tvOS 15.4 的设备或模拟器上测试订阅价格上涨。您可以使用事务管理器测试请求和响应订阅交易的涨价同意。在运行 iOS 15.4 或更高版本的设备上测试订阅价格上涨时,每个涨价同意请求都会模拟调用支付队列委托方法 paymentQueueShouldShowPriceConsent(_:)。

Swift

  • 当 non-Sendable 类型跨参与者或任务边界传递时,Swift 现在会产生警告以指示潜在的数据竞争。 

例如:


class MyCounter {
var value = 0
}

func f() -> MyCounter {
let counter = MyCounter()
Task {
counter.value += 1 // warning: capture of non-Sendable type 'MyCounter'
}
return counter
}


  • 您现在可以使用新的 #unavailable 关键字编写倒置的可用性条件。

例如:


if #unavailable(iOS 15.0) {
// Old functionality
} else {
// iOS 15 functionality
}


  • 您现在可以在类型表达式和注释中包含类型占位符。类型占位符指示编译器根据通常的类型推断规则为该位置设置类型。要使用类型占位符,请输入下划线 (“_”) 而不是类型名称。

例如:


// This is OK--the compiler can infer the key type as `Int`.
let dict: [_: String] = [0: "zero", 1: "one", 2: "two”]


  • Swift 编译器现在在直接调用从 C 导入的函数时接受有限的指针类型不匹配,只要 C 语言允许这些指针类型使用别名。因此,任何 Swift Unsafe[Mutable]Pointer

     或 Unsafe[Mutable]RawPointer 都可以传递给声明为 [signed|unsigned] char * 的 C 函数参数。Swift Unsafe[Mutable]Pointer 也可以传递给具有整数类型的 C 函数参数,该整数类型与 T 的区别仅在于其符号性。(SE-0324, 87735396)

例如,在导入 C 函数声明后:

long long decode_int64(const char *ptr_to_int64);


Swift 现在可以直接将原始指针作为函数参数传递。

例如:

func decodeAsInt64(data: Data) -> Int64 {
data.withUnsafeBytes { (bytes: UnsafeRawBufferPointer) in
decode_int64(bytes.baseAddress!)
}
}


  • 现在可以在嵌套类型的父级中正确检测到协议成员的类型签名中对自我或所谓的 Self requirements 的引用。因此,您不能在协议上声明这些协议成员。

例如:

struct Outer {
struct Inner {}
}

protocol P {}
extension P {
func method(arg: Outer<Self>.Inner) {}
}

func test(p: P) {
// error: 'method' has a 'Self' requirement and can’t be used on a value of
// protocol type (use a generic constraint instead).
_ = p.method
}

Swift 包管理器

  • Swift 包现在支持 SE-0303 和 SE-0325 中定义的构建工具插件。这允许包定义插件,这些插件可以指定应该在构建操作期间运行的工具,例如生成源代码。swift 包和 Xcode 对包的支持都支持这一点。

  • swift package 命令现在支持 SE-0332 中定义的命令插件。这允许 Packages 定义可以使用 swift package 命令行调用的命令,以对包执行自定义操作。

测试(Beta 2)

  • XCTest 现在支持在 UI 测试期间重置“本地网络”受保护资源的授权状态。

  • 重复运行测试时,测试运行器现在将当前迭代编号打印到控制台。


浏览 9
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报