原文连接canvas
距离 Xcode 10.1 正式版发布已经将近一个月了,咱们今天从新来回顾一下 Xcode 10.1 的新特性,以及已解决的问题和存在的问题。swift
本文主要参考了《Xcode 10.1 Release Notes》进行整理,同时你也能够查阅《Xcode 10 Release Notes》获取更多关于 Xcode 10 的细节。数组
接下来咱们将以新特性(New Features)、已解决的问题(Resolved Issues)、已知问题(Known Issues)等几方面来介绍 Xcode 10.1 在各模块上的更新。xcode
若是你想尝试尚处于开发者预览版的 arm64e,请在 Xcode 项目编辑器中选择你的 iOS app 对应的 target,在 Build Settings 中找到 "Architectures" 设置项,选择 "Other…" 选项,而后添加手动添加 arm64e 到 architectures 列表中。架构
注:目前 App Store 和 TestFlight 并不接受包含 arm64e 的提交,因此当咱们 Archive 后在 Organizer 窗口要向苹果提交发布时,Xcode 会自动移除掉 app 包中 arm64e 的内容。app
菜单中 Navigate > Open in… 的导航栏 UI 再也不将窗口中的各个 tabs 显示为单独的窗口,每一个窗口都有一个 tab。编辑器
xed 工具如今使用由当前 xcode-select
或 DEVELOPER_DIR
环境变量指定的 Xcode。ide
libunwind
库进行修改,解决了在 iPhone XS 和 iPhone XS Max 上运行少部分 app 的问题。注:关于这个问题,相信你们已经很熟悉了,网上有不少讨论,咱们以前也发了几条相关的小集。它是在 Xcode 10.0 上开始出现的,而在 Xcode 10.1 刚发布时,苹果声称已经解决了,后面你们纷纷表示这个问题仍然存在。不过根据微博上的最新消息和小伙伴们的亲自验证,苹果已经在服务端解决了这个问题,开发者经过 Xcode 10.1 打的 ipa 包在上传到 App Store Connect 后台,苹果在处理包的过程当中会自动修复。函数
新的构建系统支持“按需资源”(On Demand Resources,ODR)。工具
修复了问题:在为 .xib 文件或 storyboards 使用基本本地化时,不会将与基本文件关联的各个本地化的 .xib 文件或 storyboards 编译到产品中。
修复了问题:在将视图与 UIScrollView
的子视图添加约束时, Auto Layout 会错误报告问题。
提升了画布(canvas)的性能:当底部设备栏在 iPhone XS、iPhone XS Max 和 iPhone XR 之间切换时。
修复了致使预览助手编辑器(Preview assistant editor)中监视内容布局与设备栏选择不匹配的问题。
如今,当启用 @IBDesignable
视图时,将使用新的构建系统进行编译。
simctl
,在模拟器正在打开时关闭了模拟的设备,则模拟器在下次启动设备时没法正确地从新链接到模拟器。若是你安装了多个版本的 Xcode,则在其余版本的 Xcode 中运行模拟器是可能也会遇到这个问题。*临时解决方案:*退出并从新启动模拟器。要在不关闭全部模拟器的状况下退出,请先按住 Option 键并选择 Simulator > Quit Simulator…,而后在出现的对话框中选择 "Keep Running"。
例如:
protocol SomeProtocol { }
class SomeClass: SomeProtocol { }
extension SomeProtocol {
var someNonmutatingProperty: CGPoint {
nonmutating set { _ = self }
get { return .zero }
}
}
// Might be miscompiled, deallocating SomeClass() too early.
SomeClass().someNonmutatingProperty.x = 42
复制代码
*临时解决方案:*将该操做分解为多个语句,以便 get 和 set 操做在不一样的语句中发生:
let someObject = SomeClass()
// First get the nonmutating property value.
var temp = someObject.someNonmutatingProperty
temp.x = 42
// Then modify it.
someObject.someNonmutatingProperty = temp
复制代码
Xcode 中的 Playgrounds 再也不记录关于在运行时类型没法解码的字段的信息。
如今编译 Swift 代码时会始终报告致使任何失败的错误。例如,以前可能会发生诸如 "Command CompileSwiftSources failed with a zeroo exit code" 之类的消息,而没有伴随的失败缘由。
包含空格的长文件路径将不会再致使构建失败。
NSBundle
类的 bundleForClass:
初始化方法如今与 Swift 类保持一致,包括即便不在最新的操做系统版本上运行。
如今能够将以函数类型做为参数的泛型类的 "let property" 成功传递给另外一个函数或方法。
class A<B> {
let function: (B) -> B
}
func takeFunction(_: (Int) -> Int) {}
func passFunction(from a: A<Int>) {
takeFunction(a.function)
}
复制代码
对嵌套上下文中(nested context)的捕获值所作的更改如今将反映在外部上下文中(outer context)。
如今能够成功调用一个在协议类型(protocol type)的值上返回 Self 的变异方法(mutating method):
protocol Example {
mutating func test() -> Self
}
func foo(x: inout Example) {
_ = x.test() // No longer crashes the compiler sometimes.
}
复制代码
func f(_: [AnyObject])
f([NSObject.self, NSString.self])
复制代码
FixedWidthInteger
协议中的 unsafeAdding(_:)
, unsafeSubtracting(_:)
, unsafeDivided(by:)
, 以及 unsafeMultiplied(by:)
等方法已弃用(deprecated),并将在之后的版本中删除。这些方法在溢出条件下会产生未定义的行为。所以在算术运算的状况下,可使用 assert
和 addingReportingOverflow(_:)
方法或者 &+
运算符的组合,这二者都会在溢出的状况下有明肯定义的结果。
*临时解决方案:*当进行分析测试时能够经过以下方式禁用并行测试:在 Xcode 菜单栏中打开 Product > Scheme > Edit Scheme... > Test > Info,选择测试 target 旁边的 "Options" 按钮,而后禁用 "Execute in parallet" 复选框。
使用旧版构建系统(legacy build system)的项目中的 UI 测试,目前可支持在 iPhone XS 和 iPhone XS Max 上运行了。
若是一个 UI 测试的目标 app 在模拟器上进行测试期间崩溃了,则如今能够将其正确地报告为测试失败,而不是像以前那样被错误地视为成功测试,或者显示有关 "Application state unknown" 失败信息。
Xcode 10.1 beta 2 及更高版本支持在运行 iOS 12 beta 版的设备上进行 UI 测试。
修复了若是在测试已经开始后的任什么时候刻添加观察者,则此时添加到 XCTestObservationCenter
共享实例对象上的观察者的 testBundleDidFinish:
方法不会被调用的问题(例如:在全部当前注册的观察者上调用了 testBundleWillStart:
方法以后)。
当接收器(receiver)是一个菜单项或者菜单项的子视图时, XCUIElement
类的 click
和 hover
方法如今能够自动滚动菜单了。
Xcode 10.1 Release Notes developer.apple.com/documentati…
Xcode 10 Release Notes developer.apple.com/documentati…
注:本文翻译内容若有描述不许确的地方,请参考上述英文原文。