Xcode 11.4 发布,添加了不少新特性,同时也修改了原有的一些 BUG。本文依据官方文档 Xcode 11.4 Release Notes,将其中的新特性提取出来,如果需要了解修复的问题,可直接查看文档。
通用购买
Project Editor
Signing & Capabilities
-Watimport-in-framework-header
@import
#if __has_feature(modules)
#if __has_warning("-Watimport-in-framework-header")
#pragma clang diagnostic ignored "-Watimport-in-framework-header"
#endif
@import NameOfFramework;
#endif
default
$(SETTING:default=something)
如果
$(SETTING)
为空,则此表达式的计算结果为“something”。默认值本身可以是包含构建设置的表达式。(57402718)
• 现在,要使用新的构建系统构建无代码内核扩展,就需要将
GENERATE_KERNEL_MODULE_INFO_FILE
构建设置设置为 NO。(57247534)
Scheme Editor
Options
my-selfsigned.cer
$ xcrun simctl keychain
将证书添加到受信任的根存储中会创建 TLS/SSL 连接来信任该证书。
•
simctl
现在支持修改隐私权限。您可以修改隐私权限以创建已知状态来进行测试。例如,要允许示例应用程序在没有任何提示的情况下访问照片库:
xcrun simctl privacy
要将所有权限重置为默认值,就像以前从未安装过该应用程序一样:
xcrun simctl privacy
重置权限后,请测试您的应用程序,以确保您在 Info.plist 中具有正确的使用描述键,并且可以正确地请求和处理不同的授权状态。有关更多信息,请参考
xcrun simctl help privacy
。
• 模拟器支持 iOS 模拟器(13.0及更高版本)切换外观。在应用程序中,选择 Debug > Toggle Appearance。在命令行中使用
simctl ui
子命令,例如设置深色外观(54556446)(FB7093020):
$ xcrun simctl ui
• Simulator 现在有一个菜单项和键盘快捷键,可在 iOS Simulators 中调出应用程序切换器。
•
simctl status_bar
现在允许更改操作符名称。
• 模拟器现在有一个可在iOS模拟器中触发屏幕截图的菜单项。这样会将屏幕截图保存到模拟设备的相机中。为了清晰起见,现有的屏幕截图功能已重命名为
Save Screen
,并且默认情况下会继续将设备的帧缓冲保存到 Mac 桌面。保存屏幕时按住 Option 键可更改默认位置。
• tvOS 模拟器不再像与 Mac 配对的 Siri Remote 一样捕获 TouchBar。
• Simulator 支持模拟远程推送通知,包括后台内容获取通知。在模拟器中,将 APNs 文件拖放到目标模拟器上。该文件必须是带有
Apple Push Notification Service
有效负载(包括“aps”键)的 JSON 文件。它还必须包含一个顶级
Simulator Target Bundle
,其字符串值必须与目标应用程序的 bundle id 相匹配。
simctl 也支持发送模拟的推送通知。如果文件包含
Simulator Target Bundle
,则不需要 bundle id,否则,必须将其作为参数提供:
$ xcrun simctl push
• Simulator 具有一个新的 UI,可简化与模拟设备的协作。模拟设备窗口有标准标题栏,带有用于执行常规任务的按钮。应用程序级设置现在在
Preferences
窗口中可用。
func callAsFunction
struct Adder {
var base: Int
func callAsFunction(_ x: Int) -> Int {
return x + base
}
}
var adder = Adder(base: 3)
adder(10) // returns 13, same as adder.callAsFunction(10)
您必须在调用位置包含
func callAsFunction
参数标签。您可以在单个类型上添加多个 func callAsFunction 方法,并且可以将它们标记为 mutating。func callAsFunction 可用与 throws 和 rethrows 以及尾随闭包一起使用。
• 下标现在可以声明默认参数。
struct Subscriptable {
subscript(x: Int, y: Int = 0) {
...
}
}
let s = Subscriptable()
print(s[0])
• 类约束的协议扩展(其中扩展协议未施加类约束)现在可以隐式推断该约束。
protocol Foo {}
class Bar: Foo {
var someProperty: Int = 0
}
// Even though 'Foo' does not impose a class constraint, it is automatically
// inferred due to the Self: Bar constraint.
extension Foo where Self: Bar {
var anotherProperty: Int {
get { return someProperty }
// As a result, the setter is now implicitly nonmutating, just like it would
// be if 'Foo' had a class constraint.
set { someProperty = newValue }
}
}
• 现在,在定义基类的模块外部定义的子类的便捷初始化构造器有附加的限制。当这些子类继承自带有非公开(non-public)指定初始化器的基类时,它们将不再从其超类中自动继承便捷初始化器。为了恢复这种自动继承行为,基类必须确保其所有指定的初始化器访问限制是 public 或 open。
• Xcode 和相应的 Command Line Tools 包包含用于 Swift 和 C 语言的 SourceKit-LSP 语言服务器。语言服务器尚处于早期开发阶段,这是尝试它的好时机。SourceKit-LSP 可以与支持语言服务器协议(LSP)的第三方工具一起使用,并且它支持从命令行构建的 Swift 软件包。有关使用 SourceKit-LSP 的信息,请参阅 Getting Started with SourceKit-LSP。
• Swift 编译器使用一种新策略来产生诊断,从而大大提高错误消息的质量和准确性。有关此新策略的详细信息,请参见 New Diagnostic Architecture Overview 。
• 如果基类方法没有强制要求,则子类在重写时不能为泛型参数附加约束。例如,以下代码会产生错误。(23626260)(FB5382462)
protocol P {}
class Base {
func foo
}
class Derived: Base {
// generates an error because of the added requirement
override func foo
}
-test-timeouts-enabled
-default-test-execution-time-allowance
-maximum-test-execution-time-allowance
Test Timeouts
resetAuthorizationStatus(for:)
-parallelize-tests-among-destinations
近期精彩内容推荐: 在看点这里好文分享给更多人↓↓
func test_canAuthenticate() throws {
XCTSkipIf(AuthManager.canAccessServer == false, "Can't access server")
// Perform test…
}
XCTSkipUnless(_:_:file:line:)
API类似于
XCTSkipIf(_:_:file:line:)
API,但是如果提供的表达式为 false 而不是 true,则会跳过,同时可以使用 XCTSkip API 无条件跳过。
• 现在,如果测试超过了配置的持续时间,XCTest 允许各个测试超时。如果通过测试计划选项或 xcodebuild 命令行选项启用了超时,则将为每个测试提供默认的余量,必须在此时间范围内完成测试。超过此时间长度的测试将失败,并且测试过程的转储将附加到测试报告中的相应的测试信息中。如果测试需要额外的时间来运行,则可以通过 XCTestCase 上的 executionTimeAllowance 属性进行请求。有关更多信息,请参考 XCTestCase.h 中的文档。