
Xcode,macOS Mojave和iOS的新Beta代码已经发布-这是我学到的要点。
Xcode 10.2 Beta的Swift 5
斯威夫特
首先,最新版本的Xcode与新版本的Swift捆绑在一起:
Apple Swift 5.0 (swiftlang-1001.0.45.7 clang-1001.0.37.7)
Target: x86_64-apple-darwin18.2.0
ABI version: 0.6
让我们从最令人兴奋的新闻开始:
Swift应用程序不再包含用于iOS 12.2,watchOS 5.2和tvOS 12.2设备的Swift标准库的DLL和Swift SDK覆盖。 因此,在部署以在TestFlight中进行测试或压缩发行版的归档文件时,Swift应用程序的大小会减小。
ABI最终将变得稳定,这是个好消息。 我认为,今天这是Swift的关键问题之一-不是因为副作用,而是因为没有兑现承诺。 我的一些朋友甚至在Objective-C上重写了Apple Watch的扩展,以减小二进制文件的大小(从大约15 MB到1 MB)。 您可以通过以下链接了解有关ABI状态的更多信息:
Swift ABI仪表板和Swift ABI 稳定性清单 。
@dynamicCallable属性允许您像使用简单语法糖的函数一样调用命名类型。 主要目的是确保与动态语言兼容。 ( SE-0216 )
一个例子:
@dynamicCallable struct ToyCallable { func dynamicallyCall(withArguments: [Int]) {} func dynamicallyCall(withKeywordArguments: KeyValuePairs<String, Int>) {} } let x = ToyCallable() x(1, 2, 3) // Desugars to `x.dynamicallyCall(withArguments: [1, 2, 3])` x(label: 1, 2) // Desugars to `x.dynamicallyCall(withKeywordArguments: ["label": 1, "": 2])
这个话题涉及面很广,创新让我百感交集。 保罗·哈德森(Paul Hudson)在“
Swift 5.0的新增功能 ”一文中从中立的角度进行了讨论。
不包括Swift 3兼容模式。 -swift-version
标志的支持值为-swift-version
和5。
时代已经过去:与Swift 3的源代码级兼容性不再存在。 此步骤是预期的,已在Swift 5路线图中宣布。 我强烈建议您阅读
Swift 5.0 Release Process刷新您的记忆。 Swift 5在这里-准备好。
在Swift 5模式下,在Objective-C中声明或来自系统框架的枚举的switch语句必须处理未知值-即,将来可能添加的值,或可能在Objective-C实现文件中单独定义的值。
形式上,Objective-C允许您在枚举中包含与基本类型匹配的任何值。 这些未知情况可以通过新的case @unknown default
@ @unknown default
来处理,如果遗漏了开关中的任何已知案例,它仍然会发出警告。 也可以使用通常的default
控制它们。 如果在Objective-C中指定了枚举,并且不希望客户端必须处理未知值,请使用NS_CLOSED_ENUM
宏而不是NS_ENUM
。 Swift编译器可以识别它,不需要在switch语句中指定default
。
在Swift 4和4.2模式下,您还可以使用@unknown default
。 如果不这样做,并且开关中缺少未知值,程序将被中断-就像在Swift 4.2和Xcode 10.1( SE-0192 )中一样
这是一个长期存在的问题,仍然会带来不便,尤其是如果您不想在交换机中设置
default
交换机时。 我记得在iOS 12中以
UNAuthorizationOptions
类型出现的
.provisional
选项
.provisional
我带来了多少折磨。 现在,随着
unknown
案例的引入,处理这种情况变得更加容易。
迅捷包管理器
现在,当使用Swift 5中的Package.swift配置文件时,程序包可以选择Apple平台(macOS,iOS)的最低要求版本。如果至少一个依赖项的平台最低版本大于为程序包本身指定的版本,则无法进行程序包组装。 ( SE-0236 )
我认为,这是有关SPM的最重要新闻。 实际上,此功能可以解决许多阻止SPM在iOS世界中变得有用的问题。 在
上一篇文章中,我尝试在iOS开发的背景下分析SPM的当前状态。 看来现在我必须回顾得出的结论。
但是有问题:
- 与以前的版本相比,一些项目显示编译时间的回归;
- 用于命令行的项目在启动时崩溃,并
dyld: Library not loaded
错误dyld: Library not loaded
(未加载库)。 拐杖: SWIFT_FORCE_STATIC_LINK_STDLIB=YES
自定义程序集SWIFT_FORCE_STATIC_LINK_STDLIB=YES
。
更改日志列出了一些已修复的错误以及有关Swift 5的其他信息,这些信息可能对您的行业很重要。 签出它们:您可能决定使用带有可变数量参数的继承的,指定的初始化程序。 也许由于类和泛型的复杂递归类型定义,您可能面临死锁问题。 否则
@objc
方法中的通用别名会给您带来不便。
Xcode 10.2 Beta
lang编译器
Clang编译器有很多新警报,其中大多数与框架和模块有关。 这个事实非常有趣,因为(
大概 )讨论了Swift Package Manager作为依赖项管理工具的集成。 我认为这里最重要的要点是:
- 新的诊断程序会识别使用引号而不是框架样式包含的框架标头。 默认情况下,通知是关闭的,但是您可以通过传递
clang
选项-Wquoted-include-in-framework-header
来启用它。
- 框架的开放头文件可能会错误地执行
#import
或#include
封闭头文件,这会导致结构破坏,有时还会导致模块的循环导入。 此类违规将由新诊断报告。 默认情况下,它在clang
处于禁用状态,并由-Wframework-include-private-from-public
标志控制;
- 在框架的标题中使用
@import
它们在没有模块的情况下使用。 传递—fmodules
标志时,新的诊断程序将在标头中查找@import
。 默认情况下,它是通过-Watimport-in-framework-header
标志禁用和控制的;
- 早先,在为
framework
声明模块时丢失framework
关键字不会干扰编译,但会导致错误结果。 新的诊断程序-Wincomplete-framework-module-declaration
和新的修复程序将为您提供所需的密钥。 当clang
—fmodules
标志时, —fmodules
自动触发此警告。
首先:如何打开它们? 转到项目的
Build Settings菜单,选择
Apple Clang-Custom Compiler Flags项,然后在
Other C Flags下设置所需的
标志 。

我尝试构建一个旧的Objective-C应用程序,并在框架的开放头文件中发现了私有头文件的许多问题:

框架内导入引号也存在问题:

我建议您进行类似的诊断,或者至少为将来做个记录。 一旦这些问题会造成很多麻烦。
建立系统
代码构建系统也有一个不错的更新。
现在,在隐式依赖关系中的搜索也可以在标记为-framework, -weak_framework, -reexport_framework, -lazy_framework, -weak-l, -reexport-l, -lazy-l —l.
的相关框架和库的“其他链接器标志”部分中进行-framework, -weak_framework, -reexport_framework, -lazy_framework, -weak-l, -reexport-l, -lazy-l —l.
这项创新也很有趣。 从本质上讲,这意味着您现在可以使用
.xcconfig
甚至
xcodebuild
来定义隐式依赖
xcodebuild
,从而避免了Xcode本身中的Link / Embed阶段。
侦错
调试器创新:
现在, UIStackView
属性显示在可视调试器检查器中。 可视调试器具有更紧凑的三维外观。

现在,如果由于内存不足而发生错误,Xcode可以自动创建内存使用情况图表。 您可以在诊断窗口的设置执行方案中启用图形的创建。
在iOS和watchOS中达到内存使用量限制时,Xcode在内存使用量报告中显示该限制。

看到红线了吗? 达到时,Watchdog将收到通知
applicationDidReceiveMemoryWarning
。 我认为此更新会更有用,但现在只是一个小小的优点。
LLDB调试器
LLDB中出现了新的面包:
- 现在,在计算闭包内部的表达式时,可以使用$ 0,$ 1和其他缩写。
- LLDB现在为frame variable命令添加了一个新别名
v
,该别名用于显示当前帧堆栈中的变量。 由于这不包含用于评估表达式的工具,因此v
可以比p
或po
快得多,因此是可取的。
我没有发现性能上的改进,但是在某些情况下
v
可以提供更好的输出-但这并不是
po
的直接替代,只能在当前帧堆栈有一定限制的情况下使用。 范例:

游乐场
我最喜欢的部分! 让我们从错误开始:
Playgrounds应用可能无法启动
不幸的是,新Beta中没有关于Playgrounds的其他新闻。
仿真器
关于模拟器的几句话:
Siri在watchOS和iOS模拟器中不起作用。
macOS和模拟的iOS设备之间的粘贴板同步已变得更加可靠。
我希望这是真的。
所有模拟设备上的麦克风访问请求都不会重复。
这是一个好消息,因为许多人因为此问题而难以使用CI并建立代理。 现在,您可以建立拐杖,或者至少可以通过包括“一次运行模拟器”选项来补充有关组装代理的指南。
测试中
xccov
支持将多个代码覆盖率报告(和相关归档)组合到一个通用报告和归档中。 生成的报告可能不准确,因为在创建报告的那一刻之间,源文件中可能会发生更改。 如果未发生任何更改,则报告将是正确的。
xccov
现在反映了各种Xcode覆盖率报告之间的差异,可用于计算覆盖率变化。 例如,要突出显示before.xccovreport
和after.xccovreport
之间的区别,请按如下所示调用xccov
命令: xccov diff --json before.xccovreport after.xccovreport
。
- 静态库和框架目标现在以顶级条目的形式出现在覆盖率报告中-为包括静态库或框架的所有目标收集了覆盖率指标图。 即使将静态库或框架目标的源文件从图中的代码覆盖范围中删除,也可以解决将静态库或框架目标的源文件输入到报表中的问题。
持续集成的好消息,特别是差异的证明。 告诉您的发布工程师或从事类似工作的人员。
但是,关于测试并行化存在一些限制:
- 启用并行化后,无法在克隆上进行记录;
- 在启用测试并行化的情况下,从Xcode进行项目分析的行为不正确。
其余的人对一些错误的更正感到满意:
如果由于启动时测试运行程序崩溃而导致测试失败,则Xcode将尝试生成描述错误的详细消息。 您可以在测试日志中检查该错误,如果使用xcodebuild
,则该错误也会显示在stdout
。 它也包含在结果包的结构化日志中。
我们经常遇到类似的问题-我们对所发生的事情不知所措。 有时问题是布局错误,有时系统过载。 现在,应用程序的可靠性将提高。
在测试过程中收集的崩溃报告中,重要部分(例如崩溃原因或描述)不再丢失。
这里暂无评论,非常高兴。
对许多开发人员有用的最新消息:Xcode现在支持
macOS内容缓存服务 。 这意味着您可以在本地网络上创建缓存服务器,当在本地网络上下载新版本和旧版本的Xcode时,这将节省时间和金钱。
问题所在
在此Beta中,我遇到了几个问题。 他们主要关注第三方开发人员提供的工具。 例如,
carthage
生成错误“找不到适用于iOS的模拟器”。
我检查了可用的模拟器,似乎应该归咎于beta错误。 此外,无法从Xcode下载其他运行时-可用的模拟器列表为空:
$ xcrun simctl list devices --json | grep -A16 12.1 "com.apple.CoreSimulator.SimRuntime.iOS-12-1" : [ { "availability" : "(unavailable, runtime profile not found)", "state" : "Shutdown", "isAvailable" : false, "name" : "iPhone 5s", "udid" : "DDD36346-A76F-42E8-80F4-6F11E1EE4BEB", "availabilityError" : "runtime profile not found" }, { "availability" : "(unavailable, runtime profile not found)", "state" : "Shutdown", "isAvailable" : false, "name" : "iPhone 6", "udid" : "21794717-BC89-45E4-9F57-8CF9D14A87D1", "availabilityError" : "runtime profile not found" }, --
但是,这只是beta版,更改列表非常多。 我们会耐心的。 迦太基已经在研究情况,此
错误中概述了所有猜测。
iOS 12.2 Beta
一般般 苹果似乎正忙于清理技术债务并应用安全补丁,因此没有什么重大消息,但存在两个问题:
- 选择卡后,您可能无法使用电子钱包进行身份验证;
- 您有可能无法使用移动网络购买预付费资费计划。
苹果新闻现已在加拿大上市。
请勿切换。
macOS Mojave 10.14.4 Beta
从Safari 10.1.2升级后,这里唯一的更新是Safari 12.1可能存在的问题。
从Safari 10.1.2升级到Safari 12.1后,网页可能无法正确显示。 (47335741)
解决方法:在终端中键入
defaults delete com.apple.Safari
。 请注意,这样做会丢失所有以前的Safari设置。
总结
这篇文章比我预期的要大得多。 您将在上面找到我的所有发现。 简而言之-Swift 5来了!
谢谢您的关注。