Xcode 12.5 新特性一览
随着 iOS 14.5 RC 版的发布,Xcode 12.5 RC 版也发布了。Xcode 12.5 beta 版本没有跟着 iOS 14.5 beta 版本的节奏,而是在 beta 3 后就没再发布新的 beta 版本,而 iOS 14.5 则一直发布到 beta 8。RC 版发布,正式版也不会太远,让我们一起来看看 Xcode 12.5 版本的新特性。另外已修复了一些现有的问题,可以查看 Releast Note 查看具体内容。
通用
可以使用新的 File Provider Extension 目标模板来创建 macOS File Provider 程序扩展。
Product 菜单中的 Reveal Build Products Folder 项将打开 Finder,并选择 Xcode 用来构建产品的文件夹。
Apple Clang Compiler
libc++ 不再支持
_LIBCPP_RAW_ITERATORS
宏。可使用封装的迭代器。Clang 现在从
-init
方法的可用性注释中推断+new
的可用性。由于+new
会调用[[Foo alloc] init]
,因此除非+init
可用,否则+new
不可用。
构建系统
在构建应用托管的测试 target 时,构建系统不再为托管应用 target 重新签名;相反,它会在应用 target 的签名任务运行之前构建测试 target。这消除了额外的代码签名任务,从而加快了具有此类测试 target 的大型应用程序的构建。
xcodebuild 现在在创建 XCFramework 时支持
-archive
标志,提供了一种从一个或多个归档文件创建 XCFramework 的简便方法。
例如
xcodebuild -archive <archive_path1> -framework MyFramework.framework -archive <archive_path2> -framework MyFramework.framework -o <output_xcframework_path>
Code Completion
在包含错误的表达式中以及在没有附加上下文的情况下含糊不清的表达式中,代码完成更为可靠。
例如,以下代码:
func test(a: Int, b: String) -> Int { ... }
func test(a: Int, b: Int) -> String { ... }
func test(a: (Int, Int) -> Int) -> Int { ... }
test().prefix(3).
之后会给出 String 成员提示。而 test(a: 2).
会给出 Int 和 String 的成员。以下代码中的 $0
会给出 Int 成员:
test {
$0.
}
调试
现在,当使用 libc++ 调试 C++ 程序时,LLDB 为 STL 容器和算法提供了改进的表达式评估支持。
可以调用 STL 容器的成员函数,即使从未在目标程序中调用它们。
LLDB 可以从标准库中实例化模板化函数。这包括
std::sort
,std::count
,std::count_if
等算法。
Instruments
os-signpost-interval
模式中的<(start | end)-pattern>
元素现在是可选的。这使Custom Instruments
可以通过名称和其他属性来匹配路标,而无需指定期望的消息格式。现在,使用 Instruments 对 XCTest 进行性能分析将自动开始记录,而无需单击“记录”按钮。
Instruments 现在可以从包含日志记录级别数据的 ktrace 文件中导入 os_log 和 os_signpost 数据。
Custom Instruments 可以指定静态定义的子轨道,而无需由表列数据驱动。
xctrace export 会按时间顺序生成输出。
针对 xctrace 的目录查询公开了有关运行的元数据信息。
Interface Builder
可以在检查器中为 NSObjectController 和类似对象配置用于自定义类的模块。
本地化
可以使用 Xcode 将应用程序本地化为所有 ISO 639 语言。
现在,您可以使用工作空间导出用于本地化的项目集合,从而为工作空间中的所有项目生成单个本地化目录。作为此更改的一部分,导入和导出以进行本地化的选项现在位于 Product 菜单中,而不是在 Editor 菜单中。还可以将
xcodebuild -importLocalizations
和xcodebuild -exportLocalizations
与-workspace
选项一起使用来导出或导入工作区。通过新的支持本地化导出的构建设置,您可以为不需要本地化的特定目标或项目禁用本地化导出。
Playgrounds
应用程序项目中的 Playground 现在可以访问应用程序目标中的符号。创建的新 Playground 默认情况下启用此选项。要在现有的 Playground 文档中启用此功能,请在 File Inspector 中打开 Import App Types 选项。
深度嵌套的 Swift 数组和结构的内联结果现在在 Xcode Playgrounds 中显示更多信息。
模拟器
模拟器现在支持从应用程序内录制视频。单击工具栏上的屏幕快照按钮时,按住 Hold Option(或按Command + R)以录制视频。单击红色按钮停止录像。
模拟器可以使用新的“录制视频”功能从录制的视频中创建动画GIF。录制视频后,右键单击视频预览,然后选择另存为动画GIF。要同时保留视频文件和GIF动画,请按住 Option 键,然后选择 Save Copy as Animated GIF。您可以在 Simulator Preferences 中调整生成的GIF的尺寸和大小。
StoreKit
Xcode 中的 StoreKit Testing 现在支持测试非续订订阅。
现在,可以在 watchOS 上使用 StoreKit Test 框架。
Swift Packages
现在,指定 5.4 工具版本的 Swift 软件包可以显式地将目标声明为可执行文件,从而允许在软件包代码中使用 @main 关键字。
Swift Package Manager 现在可以自动将软件包产品和目标构建为动态框架,如果这样做可以避免在运行时复制库代码。
Swift Package Manager 基于每个用户缓存软件包依赖关系,这减少了网络流量,并提高了对于后续使用同一软件包的依赖关系解析的性能。如果需要,可以通过使用新的
-disablePackageRepositoryCache
标志来禁用xcodebuild
中的缓存使用。
测试
XCTest 现在支持将测试失败标记为“预期”。预期的测试失败不会影响包含测试的套件的总体通过/失败结果。Xcode 在“测试导航器”和“测试报告”中以不同的方式显示预期的故障,并突出显示发生预期故障的代码行以及可选的用户描述。预期的测试失败提供了一种低开销的工具,用于在无法立即解决的失败时保留项目测试套件的整体“绿色”状态,从而确保可以清楚地看到任何新的失败。与跳过使用XCTSkip进行的测试相反,具有预期失败的测试仍会运行,并报告所有意外更改。(13408632)
要按预期方式标记故障,可在产生测试失败的代码之前在测试中调用新的 XCTExpectFailure API ,例如:
XCTExpectFailure("…")
// Perform test which currently fails
此外,可以通过将失败的代码包含在闭包中来限制预期失败的范围:
// Arrange and act on the test subject
XCTExpectFailure("…") {
XCTAssert(…) // Failing assertion
}
// Continue test with further assertions etc.
默认情况下,如果调用 XCTExpectFailure 但测试未记录失败,则 XCTest 会将测试标记为由于“无法匹配的预期失败”而失败。通过传递 XCTExpectFailure XCTExpectedFailure.Options 对象作为参数,并将其 isStrict 属性设置为false,可以抑制不确定发生的故障:
let options = XCTExpectedFailure.Options()
options.isStrict = false
XCTExpectFailure("…", options: options)
// Perform test which sometimes fails
现在,Xcode允许您清除测试结果,而不必通过从 Xcode 的 Product 菜单中选择 Clean Test Results 来重新打开工作区。
Xcode 现在支持针对 watchOS 应用程序的 XCTest 单元和 UI 测试。创建新的 watchOS 应用程序时,请选中 Include tests 复选框,以将单元和UI测试目标添加到新创建的项目中。对于现有项目,请通过“文件”>“新建”>“目标”添加单元或UI测试目标,然后将测试目标添加到 WatchKit App 方案的 Test 操作中。要运行测试,请从工具栏的“运行目标”菜单中选择手表模拟器或设备,然后选择 Product > Test。请注意,watchOS 7.4 或更高版本支持测试。
现在,当在 macOS 11.3,iOS 14.5,tvOS 14.5,watchOS 7.4 或更高版本的OS上运行测试时,XCTest 现在自动包括 Swift 通用测试类的专用子类。这使您可以使用泛型来提高测试类的可重用性。
XCTest 现在包括
XCTAssertIdentical(_:_:_:file:line:) and XCTAssertNotIdentical(_:_:_:file:line:)
API来断言两个对象实例是否相同(同一实例)并且比 XCTAssertEqual 更严格在 Swift 中使用===
运算符而不是==
。现在,代码覆盖率报告显示每个文件的可执行行数。