Xcode 10.2,macOS Mojave 10.14.4,iOS 12.1和其他Beta



新的测试版在这里,这些是我了解到的一些最重要的内容。

Xcode 10.2 Beta的Swift 5


斯威夫特


首先,最新的Xcode beta与以下Swift版本捆绑在一起:

Apple Swift version 5.0 (swiftlang-1001.0.45.7 clang-1001.0.37.7) Target: x86_64-apple-darwin18.2.0 ABI version: 0.6 

让我们从最令人兴奋的新闻开始:
在运行iOS 12.2,watchOS 5.2和tvOS 12.2的设备的构建变体中,Swift应用程序不再包含用于Swift标准库的动态链接库和Swift SDK覆盖。 因此,在部署用于使用TestFlight进行测试或为本地开发分发而精简应用程序存档时,Swift应用程序可以较小。
应用二进制接口的稳定性即将到来! 这是个好消息。 我认为这是Swift目前最重要的问题之一。 不是因为副作用,而是因为Swift未能兑现先前的承诺。 无论如何,我什至都知道有人将他们的Apple Watch扩展重写为Objective C,以减少二进制文件的大小(在Objective C中约为15MB到1MB)。 如果您想了解有关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发布过程”刷新内存,因为Swift 5即将发布。 准备好
在Swift 5模式下,需要切换在Objective-C中声明的枚举或来自系统框架的枚举来处理未知情况 -将来可能会添加的情况,或者可能在Objective-C实现文件中私下定义的情况。 形式上,Objective-C允许将任何值存储在枚举中,只要它适合基础类型即可。
可以使用新的@unknown default案例处理这些未知案例,如果从开关中忽略了任何已知案例,该@unknown default案例仍会提供警告。 也可以使用正常的default情况处理它们。

如果您在Objective-C中定义了自己的枚举,并且不需要客户端来处理未知情况,则可以使用NS_CLOSED_ENUM宏而不是NS_ENUM 。 Swift编译器可以识别这种情况,不需要开关具有默认大小写。

在Swift 4和4.2模式下,您仍然可以使用@unknown default 。 如果省略它,并且将未知值传递到开关,则程序将在运行时捕获,就像Xcode 10.1中的Swift 4.2一样。 ( SE-0192
这曾经是,现在是一个痛苦,特别是如果您在交换机中使用默认方法的话。 我记得iOS 12中引入了UNAuthorizationOptions属性的新.provisional选项的丑陋解决方法。现在,在未知情况下,处理这种情况要容易得多。

迅捷包管理器


软件包现在可以使用Swift 5 Package.swift tools-version自定义Apple平台的最低部署目标设置。 如果软件包的任何软件包依赖项指定的最小部署目标大于软件包自身的最小部署目标,则生成软件包将产生错误。 ( SE-0236
对我而言,最重要的新闻是Swift Package Manager。 从技术上讲,此更改可以解决很多导致SPM在iOS世界中无法使用的问题。 在我以前的文章“ Swift Package Manager构建iOS框架 ”中,我试图在iOS开发的上下文中分析SPM的当前状态。 现在看来,我将不得不重新评估我的想法和结论。

还有一些不好的问题:
某些项目可能会经历早期版本的编译时间回归;
Swift命令行项目在启动时崩溃,并出现“ dyld:未加载库”错误。
解决方法:添加用户定义的构建设置

 SWIFT_FORCE_STATIC_LINK_STDLIB=YES 


许多问题以及与Swift 5相关的变更日志中的其他问题已经解决,但它们特定于您的工作。 检查它们,也许您想使用带有可变参数的继承指定的初始化程序,或者由于涉及类和泛型的复杂递归类型定义而被死锁问题所阻塞,或者您正在@objc方法中使用泛型类型别名而苦苦挣扎。

Xcode 10.2 Beta


Apple Clang编译器


Apple Clang编译器有很多新的警告。 其中大多数与框架和模块有关。 这很有趣,因为它可以与Swift Package Manager集成作为依赖工具关联。 我认为最重要的是:
一种新的诊断程序可以识别使用引号包含而不是框架样式包含的框架标题。 该警告默认情况下-Wquoted-include-in-framework-header关闭状态,但是您可以通过将-Wquoted-include-in-framework-header传递给clang来启用该警告;
框架中的公共标头可能会错误地#import#include
专用标头,这会导致分层冲突和潜在的模块周期。 有一个新的诊断报告这种违规行为。 默认情况下,它在clang中为OFF,由-Wframework-include-private-from-public标志控制;
在框架标头中使用@import防止在没有模块的情况下使用标头。 传递fmodules标志时,新的诊断程序会检测框架标题中@import的使用。 默认情况下,诊断在clang为OFF,并通过Watimport-in-framework-header标志进行控制;
以前,在为framework声明模块时省略framework关键字不会影响编译,但会默默地执行错误的操作。 一个新的诊断Wincomplete-framework-module-declaration和一个新的修复程序建议添加适当的关键字。 当您将-fmodules标志传递给clang时,默认情况下此警告处于-fmodules
首先,如何打开它们:转到针对您的应用程序目标的 构建设置” ,找到“ Apple Clang-自定义编译器标志” ,并将所需的标志放入“其他C标志”



我试图构建一个基于Objective C的旧应用程序,发现公共框架头中的私有头存在很多问题:



以及框架内双引号导入的一些问题:



我建议您也运行此类诊断程序,至少要为积压问题创建问题。 有一天,所有这些问题将使您真正头痛。

建立系统


还有一个不错的新构建系统功能:
隐式依赖项现在支持在其他链接器标记中为-framework-weak_framework-reexport_framework-lazy_framework-lazy_framework -weak-l, -reexport-l-lazy-l-l指定的链接框架和库中查找依赖项。
这也很有趣。 通常,这意味着您可以通过.xcconfig甚至使用xcodebuild选项定义隐式依赖.xcconfig ,并避免使用这些Link /
在Xcode中嵌入阶段。

侦错


调试具有新功能:
现在,UIStackView属性显示在视图调试器对象检查器中;
视图调试器提供了更紧凑的3D布局。


如果在调试时遇到内存资源异常,Xcode现在可以自动捕获内存图。 要启用内存图捕获,请转到方案的运行设置的“诊断”选项卡;
在iOS和watchOS上,当您接近内存限制时,Xcode会在“内存报告”中显示正在运行的应用程序的内存限制;


看到红线了吗? 看门狗发送applicationDidReceiveMemoryWarning(...)
当你到达边缘时。 但是,老实说,我认为这将比现在有用。 现在,它看起来只是一个较小的改进。

LLDB调试器


LLDB Debugger也很受欢迎:

现在$0, $1,您可以在闭包内部的LLDB表达式求值中使用$0, $1, ...速记;
LLDB调试器为“ frame variable”命令添加了一个新的命令别名v ,以在当前堆栈帧中打印变量。 因为v绕过了表达式求值器,所以v可以快很多,应该优先于ppo
我没有注意到任何性能上的改进,但是在某些情况下v产生更好的输出,尽管通常它不能代替po ,它仅适用于当前的堆栈框架,但有一些限制。 请参阅下面的示例。



游乐场


我最喜欢的部分? 游乐场! 让我们从已知问题开始:
操场可能无法执行!
不幸的是,这是当前Beta中有关Playgrounds的唯一新闻。

仿真器


有关模拟器的一些注意事项:
Siri在watchOS和iOS模拟器中不起作用;

macOS和模拟的iOS设备之间的粘贴板同步更可靠;
我真的希望是这样。
现在仅提示您一次授权麦克风访问所有模拟器设备。
这是一个很好的改进,因为很多人都因为此问题而遇到了CI问题并建立了代理。 现在,解决方案可以自动执行,或者至少可以通过“一次运行模拟器”步骤更新指南以设置构建代理。

测试中


xccov支持将多个覆盖率报告及其关联的归档合并到一个汇总报告和归档中。 合并报告时,对于自原始报告生成以来已更改的源文件,汇总报告可能不准确。 如果没有源更改,则汇总报告和存档将是准确的;
xccov现在支持xccov Xcode覆盖率报告,该报告可用于计算覆盖率随时间的变化。 例如,要比较coverage报告before.xccovreportafter.xccovreportxccov按以下方式调用xccovxccov diff — json before.xccovreport after.xccovreport
现在,静态库和框架目标在覆盖率报告中显示为顶级条目,其中行覆盖率值汇总在包括静态库或框架的所有目标中。 这也解决了一个问题,即使将静态库或框架目标的源文件本身从方案的代码覆盖范围中排除,也将在覆盖率报告中包含该对象。
这些变化对于持续集成而言是个好消息。 尤其不同。 让您的发布工程团队以及负责此事的其他任何人知道。

但是,与测试并行化有关的一些限制:
启用并行化后,克隆无法进行录制;
启用测试并行化后,性能分析测试无法正常运行;
也有一些有希望的错误修复:
如果由于测试运行程序在启动时崩溃而导致测试失败,则Xcode尝试生成描述失败的丰富错误消息。 如果您使用xcodebuild则此失败出现在测试活动日志中,并出现在stdout 。 该结果包中包含的结构化日志中也存在该错误。
我们遇到了很多这样的问题,通常情况下,根本不清楚。 有时,它与不正确的链接有关,有时与系统过载有关。 它应该有助于减少脱皮。
测试期间收集的崩溃报告不再忽略重要字段,例如终止原因和描述。
没有评论,只是爱。


关于Xcode的最后一点对许多开发人员的公司有用,Xcode现在支持macOS内容缓存服务 。 这意味着您可以在本地网络中拥有一个带有Xcode应用程序的缓存服务器。

问题


Beta版遇到一些问题。 大多数情况下使用第三方工具:例如,迦太基不起作用,并显示以下错误:

 Could not find any available simulators for 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" }, -- 

当然,它是一个测试版。 而且变更日志非常庞大。 要有耐心和合理:)

PS迦太基(PS Carthage)已修复( #2691 )。

iOS 12.2 Beta


好吧 看来他们正在完善其技术债务并应用安全补丁。 打破了两件事:
选择卡片后,您可能无法在电子钱包中进行身份验证;

您可能无法使用移动数据购买预付费数据套餐。
苹果新闻将在加拿大上市 。 请继续关注。

macOS Mojave 10.14.4 Beta


唯一的新事物是Safari 12.1的潜在问题。 从Safari 10.1.2升级后:
从Safari 10.1.2更新到Safari 12.1后,网页可能不会显示。
解决方法:在终端中运行以下命令:

 defaults delete com.apple.Safari 
具有以下后果:
警告:运行上述命令后,您将丢失以前的Safari设置。

最终裁切


原来这篇文章比我想象的要长得多。 好吧,我确实给了我以上所有部分的所有想法。 整篇文章的简称是“ Swift 5到了!”。

敬请期待并保持水分! 并感谢您的阅读。

Source: https://habr.com/ru/post/zh-CN437812/


All Articles