原文地址:点击打开链接
Xcode 9
Xcode 9兼容性
-
Xcode 9需要Mac运行macOS 10.12.6或更高版本。
-
Xcode 9包括iOS 11,WatchOS 4,macOS 10.13和tvOS 11的SDK。
Xcode 9.0
一般
新功能
-
在导航和助手编辑器中添加了用于确定文件对应物的后缀
Test
和Tests
后缀。(28981734) -
添加
-runFirstLaunch
了一个新xcodebuild
标志,用于检查许可协议的状态,并安装启动Xcode所需的任何软件包。(23529342) -
核心NFC现在可以通过Xcode中的“功能”选项卡启用。(32520707)
-
增加了同时运行多个版本的Xcode应用程序的支持,以及任何相关工具,如Simulator。Xcode 9.0不能与早期版本同时运行。(23140937)
已解决的问题
-
修复了导致App Store上传失败并出现错误代码-22421的问题。(25068558)
已知的问题
-
在OS X 10.9或iOS 7上,运行使用泛型投射或反射的Swift应用程序可能会导致包含该措辞的错误
object_isClass symbol not found
。(33872748) -
从管理器窗口上传应用内购买内容失败并显示错误消息
The archive contains nothing that can be signed
。(33951562)解决方法:使用转运器上传应用内购买内容。有关详细信息,请参阅https://help.apple.com/itc/appsspec。
-
导出特殊或企业IPA时,Swift符号剥离需要启用应用程序稀疏或从Bitcode重建。有关更多信息,请参阅Xcode帮助中的分发选项。(31737836)
解决方法:导出应用程序时启用应用程序稀疏或从Bitcode重建。
弃用
-
具有iOS 11的部署目标的应用程序不再构建32位片段。要构建并包含32位片,请将部署目标设置为较早版本的iOS。(32163517)
消毒液地址
新功能
-
添加了对超出范围的变量使用内存的检查。(32308829)
-
添加“检测到返回后使用堆栈”,可以选择在函数返回后使用本地函数变量的内存。打开Scheme编辑器的Diagnostics窗格中的选项。(32308829)
-
地址消毒剂现在与Malloc Scribble兼容。(32359908)
苹果LLVM编译器和低级工具
新功能
-
增加链路时间优化的性能。(22867330)
-
添加了一个警告,用于调用
performSelector
由选择器引用的方法返回结构,联合或向量类型的方法。(12056271) -
更新
-Wstrict-prototypes
以警告关于非原型函数,块声明和C和Objective-C中的类型。(15060615) -
更新了
expected identifier
错误如何处理Objective-C ++代码中的C ++关键字。在Objective-C中有效但在Objective-C ++中无效的标识符有一个更具体的错误消息。新错误的一个例子是:error: expected identifier; 'new' is a keyword in Objective-C++ @protocol new ^
。解析器在此错误后恢复更佳,以改善文件其余部分的错误报告。(20626062) -
添加
-iframeworkwithsysroot
了一个命令行选项,将系统根路径(-isysroot
)添加到提供的框架的路径。(21316352) -
添加
-Wunguarded-availability
了一个新的编译器标志,提示在部署目标版本之后的操作系统版本中引入的Objective-C API未被保密的使用。为了防止使用新的API,请使用一个
if
结合的语句@available
,一个新的Objective-C表达式来检查系统版本。例如:if(@available(macOS 10.13,iOS 11,*)){
//编译器不会警告关于使用macOS 10.13 API
//或iOS 11这里
}
C或C ++代码可以使用
__builtin_available
,它的语义相当于一个新的内置函数@available
。该
-Wunguarded-availability
标志默认关闭,以防止在现有项目中出现意外警告。,编译器标志的较不严格的版本,仅在MacOS 10.13或更高版本,iOS 11或更高版本,tvOS 11或更高版本或watchOS 4或更高版本中引入时才会警告API的无保护使用。-Wunguarded-availability-new
该-Wunguarded-availability-new
标志默认启用。(7184689) -
使用
typedef
代替块类型的块参数的占位符现在在块属性的setter使用代码完成时扩展为块声明。(21981862) -
Xcode提供缺少C ++ 11构造和关键字的代码完成结果。代码完成结果中包含以下构造:
-
static_assert
-
alignas
代码完成结果中包含以下关键字和特殊标识符:
-
constexpr
-
final
-
noexcept
-
override
-
thread_local
的
__auto_type
关键字被包括在代码完成结果代码,使用C或Objective-C的。(29219185) -
-
Xcode为依赖类的成员提供代码完成结果。例如:
模板<typename T>
void appendIfTrue(std :: vector <T>&dest,const T&value){
DEST。// Xcode现在将显示“。”后的相关完成结果。
}
请注意,当成员表达式包含依赖基础时,将不会提供代码完成结果。例如:
模板<typename T>
void appendIfTrue(std :: vector <std :: vector <T >>&dest,const T&value){
dest.at(0)。// Xcode *不会有相关的完成结果
//这里的std :: vector的成员
}
(29818301)
-
#pragma pack
包含的预编译头文件中的指令状态现在被保留。(21359084) -
即使伞头是子模块的一部分,模块图中的不完整伞头的警告也会触发。(22623686)
-
由重复包含非模块标题引起的重定义错误现在显示了导致重复包含的包含文件栈。(24116019)
已解决的问题
-
当
-E
Clang中的标志用于预处理时,editor placeholder in source file
不再显示错误。(32718000)
已知的问题
-
Xcode无法编译包含
std::function
不完整返回类型的变量的代码。例如,下面的代码不符合C ++标准。(34010071)。继续课程{
std :: function <Continuation()> m_next;
};
-
当启用了默认构建设置
-fvisibility=hidden
的符号(),并且符号声明包含具有macOS可用性的可用性属性API_AVAILABLE(macos(10.12), ios(10))
,则符号的可见性设置为default
而不是hidden
。(33655115)解决方法:
__attribute__((visibility("hidden")))
除了API_AVAILABLE
隐藏声明之外还可以使用。
弃用
-
目标早于macOS 10.11或iOS 9的目标C方法的向量参数返回值不再有效。(21662309)
资产目录
新功能
-
资产目录现在支持可以在源文件和Interface Builder中使用的命名颜色。(28900538)
-
资产目录现在支持高效率的图像格式,包括与文件
.avci
,.heic
以及.heif
文件扩展名。(29959599)
已知的问题
-
使用Xcode将应用程序提交到App Store时,资源目录中的WatchKit App Store图标不会上传。(33383969)
解决方法:使用iTunes Connect网络应用程序上传WatchKit App Store图标。
-
tvOS的应用商店图标包含2个版本的图标的未使用的插槽。此时隙中的任何图像都将被忽略。(33800909)
-
苹果电视4K应用程序必须包含2x发射图像以更高的分辨率运行。(33968521)
建筑与连接
新功能
-
Xcode 9包括了一个从Swift开始撰写的新的构建系统。它设计用于更高的可靠性,并且捕获标准构建系统没有的项目配置问题。构建系统的性能(不包括编译器,链接器和其他构建工具)已经大大改进。这个新的构建系统是建立在Swift开放源代码开发项目之上的。
在Xcode 9.0中,默认情况下禁用新的构建系统。要启用新的构建系统,请选择“文件”>“项目设置”或“文件”>“工作区设置”,然后在菜单中选择“构建系统的新建构建系统”选项。对于命令行构建,将
-UseNewBuildSystem=YES
标志传递给xcodebuild
。新的构建系统将成为未来版本的Xcode中的默认构建系统。(19209225)虽然新的构建系统与现有项目高度兼容,但由于以下原因,一些项目可能需要更改:
-
新的构建系统对构建中的元素之间的循环进行更严格的检查,以防止不必要的重建。要解决此问题,请确保生成的任何文件在需要之前生成。例如,如果一个目标都产生一个输出,并且依赖于使用该输出的其他目标,则将该输出的生产移动到其自己的目标中,并在构建中较早地运行该目标。
-
构建中的任何单个文件由多个构建命令生成是错误的。例如,如果两个目标每个从shell脚本阶段声明相同的输出文件,则将输出文件的声明归结为单个目标。
-
如果由shell脚本生成的输出文件用作构建中其他位置的输入(例如,另一个shell脚本),则该输出必须声明为生成它的脚本的显式输出; 否则构建系统可能会尝试在文件生成之前搜索文件,导致构建失败。
-
当新的构建系统不支持始终搜索用户路径(
ALWAYS_SEARCH_USER_PATHS
)设置时生成的传统标题映射YES
。相反,设置ALWAYS_SEARCH_USER_PATHS
到NO
并迁移到使用现代化的标题包括语法。-
将项目存储库中的任何所需的头文件添加到Xcode项目中,以确保它们可用于
#include
(通过项目宽标题映射)。 -
foo.h
对项目标题使用quote-style include(“ ”),并foo.h
为系统标题预留角括号include(< >)。
-
-
当运行shell脚本构建阶段时,新构建系统将
undefined_arch
作为ARCH
环境变量的值传递。以前的价值以前没有很好的定义。取决于此值的任何shell脚本必须对正在构建的所有定义的体系结构正确执行,可通过ARCHS
环境变量使用。 -
新的构建系统支持“清理构建文件夹”行为。不支持标准的“干净”行为。
-
-
对于包含Swift并定义模块的目标,生成的
module.modulemap
文件现在包含,requires objc
因此可以使用Objective-C以外的其他语言(如C ++)。(28650820) -
STRIP_SWIFT_SYMBOLS
默认情况下,新的Strip Swift Symbols()构建设置被启用。它调整符号剥离的级别,以便当构建的链接产品被剥离时,所有Swift符号都被删除。这大大减少了Swift框架的大小。如果缺少Swift符号会导致问题,例如使用时dladdr()
,可以禁用此设置。要从已经被剥离的文件中查看导出的符号,请使用xcrun dyldinfo -export
而不是nm
。(31306055) -
为测试操作启用代码覆盖的方案现在可以实现运行和分析操作的代码覆盖,从而减少构建应用程序的多个版本的需要。要关闭除测试之外的所有操作的代码覆盖,请为禁用代码覆盖率的那些操作使用单独的方案。(31848014)
-
添加了预编译桥接头(
SWIFT_PRECOMPILE_BRIDGING_HEADER
),这是Swift编译器的新构建设置。默认情况下启用此设置,并在调用的混合源构建中添加新的可选步骤PrecompileSwiftBridgingHeader
,从而提高整体构建时间。如果在此步骤中发生意外错误,请禁用此构建设置以省略可选步骤。(31851450) -
添加了Swift 3 @objc Inference(
SWIFT_SWIFT3_OBJC_INFERENCE
),这是一个新的构建设置,用于控制Swift编译器如何@objc
声明声明。默认情况下,编译器使用目标中声明的Swift版本来执行推断。新设置可用于明确指示Swift编译器使用Swift 3 Swift 4推理规则。(32121595) -
自动处理方案只有在已编辑时才会保存到磁盘。这有助于防止已经删除或添加到其他方案的目标的计划的积累。(30266825)
-
对于使用自动签名的目标,
xcodebuild
现在可以与Apple开发人员网站进行通信,以创建和更新配置配置文件,签名证书和应用程序ID。要启用此行为,请选择Xcode>首选项,然后在“帐户”窗格中添加您的Apple ID,然后将-allowProvisioningUpdates
标志传递到xcodebuild
构建目标时。(27572834) -
添加
CODE_SIGN_STYLE
了一个构建设置,用于将目标的签名样式替换为自动或手动使用时xcodebuild
。(28077832)
已解决的问题
-
当项目打开时,Xcode可以在“项目”导航器中创建一个“恢复的引用”组。该组包含在目标中引用但未在项目的组树中引用的文件。如果组出现,请将每个文件移至项目中适当的位置。(22924751)
-
将中间体文件夹的名称更改为
Intermediates.noindex
。这可以通过防止Spotlight对文件夹进行索引来提高构建时间。(29336306) -
Xcode支持包含Swift代码的静态库目标。使用Swift静态库的调试应用程序可能需要一组完整的构建工件在原始位置。(33297067)
已知的问题
-
使用新的构建系统时,不可能在使用传统或定制位置导出数据的项目或工作区中使用干净的操作。(32296417)
-
内置代码覆盖的产品不应提交给应用商店。执行
archive
方案动作时,自动禁用代码覆盖。不推荐使用该run
操作分发或提交构建的应用程序; 如果您的工作流程涉及提交使用该run
操作构建的产品,则应切换到提交操作的产品archive
。该run
行动是执行的默认操作xcodebuild
时,-scheme
与没有明确的动词,或与传递的build
动词; 用archive
动词构建archive
动作。(32870905) -
新的构建系统可能不会定义标准构建系统在启动shell脚本时定义的所有环境变量。如果新的构建系统不提供您的脚本使用的环境变量,请在https://bugreporter.apple.com上提供一个错误,其名称为环境变量,旧构建系统中的预期值,以及简短的说明你正在使用的变量。(24541618)
-
当使用新的构建系统并使用DWARF与dSYM文件调试信息时,构建可能会在每次构建迭代时执行不必要的工作来提取dSYM,降低构建性能。(30668974)
解决方法:仅使用“Release”配置,使用dSYM文件启用DWARF。
-
使用新的构建系统,在构建Debug和Release项目的配置之间进行切换可能会导致不必要的内容重建。(30924058)
-
对于单个文件,新构建系统尚不支持“产品>执行操作”子菜单的编译,分析,预处理或组合操作。(31072405)
-
当使用新的构建系统时,Interface Builder实时视图使用旧的构建系统。(31433718)
-
新的构建系统目前不支持使用按需资源的项目。(31508570)
-
当使用新的构建系统时,可能无法正确计算活动区域中报告的构建任务总数,并且在构建期间将继续增加。(31855141)
弃用
-
构建设置独立地带(
SEPARATE_STRIP
)不再支持,也不是显示在构建设置编辑器。新新新新旗新新新旗新新旗新新旗新新旗新新旗旗新新旗新新旗新新200新新旗200新新新200新新200新新200新新200新新200新新200新新200新新200新新200新新200新新200新新200新新200新200 (31584192)
核心数据
新功能
-
在使用Swift 4的项目中生成的数据模型在可能的情况下使用Swift结构。使用Swift 3的项目中生成的数据模型不变。(27512827)
-
更新了模型编辑器,为Core Data的提取索引,属性索引和实体化合物索引提供统一的界面。200新新新新新新旗新新旗新新旗新新旗新新旗新新旗新新旗新新旗新新旗新新旗新新旗旗新新旗新新旗新新旗新新旗旗新新200新新新旗新新200新新旗新新200新新旗新新200新新新200新新旗新新200新新旗新新200新新旗新新200新新旗新 编译低于iOS 11,watchOS 4,macOS 10.13或tvOS 11的目标的数据模型继续生成兼容的模型。(30843153)
-
在模型编辑器中添加了一个标志,用于标记删除后保留的属性,以支持持续历史记录跟踪。(31204966)
-
增加了对模型编辑器的支持,用于设置实体的Core Spotlight显示名称表达式。(31619747)
-
增加了对模型编辑器的支持,用于从属性,表达式和关系创建提取索引。(32407895)
崩溃主办单位
新功能
-
如果使用由Spotlight索引的本地.dSYM选择了崩溃管理器,则会标示未签名的日志。(22550064)
已解决的问题
-
增加了一些修复程序,以提高崩溃管理器的稳定性,可靠性,演示性能和性能。(29500046)
调试
新功能
-
添加了iOS和AppleTV的无线调试。(10968305)
-
增加了SpriteKit和SceneKit对视觉层次结构调试器的支持。SpriteKit节点显示为视图。SceneKit视图在SceneKit编辑器中打开一个快照。可以保存对编辑器所做的更改,不要更改应用程序。(29169315)
-
添加分配回溯到由Xcode导出或由
leaks
命令行工具生成的保存的内存图形文件。保存回溯需要为目标启用malloc堆栈日志记录。(25399716)
已解决的问题
-
Xcode内存调试器,泄漏仪器和
leaks
命令行工具不应再报告与使用Swift的过程中使用弱引用相关的小型malloc块的错误的正面泄漏。(29780048)
已知的问题
-
具有A7或A8处理器的设备上的GPU性能计数器不可用。(32982421)
-
从设备中删除无线开发配对需要通过选择“设置”>“常规”>“重设”>“重置网络设置”来重置网络设置。(31626631)
-
在GPU Frame Debugger中,在帧捕获开始之前创建的参数编码器会导致应用程序在捕获时崩溃。(32415645)
解决方法:在捕获的工作负载中创建参数编码器,或在捕获之前释放它们。
设备
已解决的问题
-
在“设备和模拟器”窗口的“设备”窗格中,当选择配有手表的iPhone时,可以正确显示配对的Apple Watch的调试控制台的按钮。(32365458)
仪器
已知的问题
-
仪器不能通过网络唤醒睡眠设备。(33384362)
解决办法:手动唤醒设备或构建和运行应用程序。
-
安装Xcode后,第一次在Simulator中运行应用程序时,内存图调试器和仪器不显示数据。(34172871)
解决方法:重新启动Mac。
界面生成器
新功能
-
在“大小”检查器中添加“布局边距”选项,以启用指定自定义边距。有关详细信息,请参阅将内容定位在布局边距内。(30086042)
-
增加了对iOS 11中添加的垂直基线到基线约束的支持。(30086144)
-
可以为任何子视图和XIB文件启用安全区域布局指南。(32956031)
-
Interface Builder会在运行时在设备上显示画布上的导航栏,制表符栏和工具栏。(30983209)
-
要在Interface Builder中使用新
usesAutomaticRowHeights
属性,请NSTableView
从“尺寸”检查器中选择“自动布局”(Auto Layout),然后为“行高度”设置一个值。新新新200新新200新200新200新200新200新新200新200新200新200新200新200新200新200新200新200新200新200新200新200新新200新新200新新200新新200新新200新新200新新200新新200新新200新新200新新 (29511510) -
将估计行,页眉和页脚高度添加到Interface Builder中的“尺寸”检查器。这些属性由UIKit用于通过将估计的高度设置为不为零的值来创建自定义大小的表单元格。(17995201)
-
使用Interface Builder文件创建的文件使用新的安全区域布局指南,而不是顶部和底部布局指南。使用安全区域的约束会部署到不支持新的安全区域指南的iOS或tvOS版本时,将自动转换为使用顶部和底部指南。要启用现有文件中的安全区域指南,请选择视图控制器或视图,打开文件检查器,并启用使用安全区域布局指南。(29323293)
-
Interface Builder允许配置列的大小调整属性
UISplitViewController
。(18359423) -
Interface Builder支持
textContentType
对符合UITextInputTraits
协议的类进行设置。在iOS 11上,这样可以提高自动填充功能,使用适当的数据(包括用户名和密码)填充。(25019432)
已解决的问题
-
当从设备配置窗格中选择风景时,Interface Builder现在将显示状态,顶部和底部栏的正确高度。另外,
IBDesignable
视图接收当前trait集合的正确值。(6799670) -
当Vary for Traits模式处于活动状态时,选择“清除约束”并重置为“建议的约束”仅影响活动配置。(27407689)
-
修改了界面生成器文档大纲视图大小时出现的图形问题。(32137309)
-
将插座和操作连接到Swift协议类类现在可以正常工作。(17023935)
-
在具有Swift协议扩展的类中声明的Outlets,actions和可检查属性现在可以正常工作。(22201035)
-
Objective-C注释,如
NS_REFINED_FOR_SWIFT
不再阻止使用IBInspectable
属性。(30509152) -
编译一个
NSTableView
使用Cocoa Bindings 的macOS故事板,不再会ibtool
挂起。(18867270)
已知的问题
-
使用Swift图像文字内容
prepareForInterfaceBuilder()
导致IBDesignablesAgentCocoaTouch
崩溃,因为实时视图是以不同的包编译的。(28676479)解决方法:使用
UIImage(named:inBundle:compatibleWithTraitCollection:)
所有图像查找,并使用Bundle(for: type(of: self))
查找实时取景类的包。 -
滚动浏览内容时导航栏不会缩小,如果为导航控制器的导航栏设置了Prefers Large Title,或者在故事板上设置。(33229609)
解决方法:将以下内容添加到根视图控制器的
awakeFromNib
方法中:self .navigationController?.navigationBar.prefersLargeTitles = false
self .navigationController?.navigationBar.prefersLargeTitles = true
self.navigationController.navigationBar.prefersLargeTitles = NO;
self.navigationController.navigationBar.prefersLargeTitles = YES;
弃用
-
界面生成器不再编译针对iOS 6或更早版本的目标。打开具有较旧部署目标的Interface Builder文档将其转换为iOS 7及更高版本。(28726486)
本土化
新功能
-
增加了XLIFF导出和导入
stringsdict
文件的支持,包括支持使用正确的每种语言的多种变体。(16785521) -
增加了对UTF-8以外的编码的XLIFF导出的支持。(18944510)
-
Xcode不再为不包含其本地化资源的测试目标导出本地化。(16813531)
已解决的问题
-
导出包含在多个目标中重复的本地化资源的本地化不再导致错误。重复的资源仅导出一次。(19059103)
-
Xcode现在使用
\n
并\t
在生成的字符串文件中表示换行符和制表符。(22981479) -
使用除标准换行符之外的行尾的字符串文件现在可以正确导入和导出。(30552675)
主线程检查器
新功能
-
添加了主线程检查器,一个新的运行时工具,可以在AppKit,UIKit和WebKit中查找必须由主线程进行调用的API,但是在其他线程上进行调用。这些调用被报告为运行时问题。主线程检查器在调试期间自动启用,并且可以在Scheme编辑器的Diagnostics选项卡中禁用。(29951764)
游乐场
已知的问题
-
macOS游乐场执行可能挂起在运行状态,没有产生任何结果。这在更改页面时更为普遍。(32429211)
解决办法:停止操场执行并重新运行。如果问题仍然存在,请关闭并重新打开Xcode。
-
该
liveTouchBar
财产PlaygroundSupport
不被支持。(31073754)
项目
新功能
-
Project Navigator中的组现在更紧密地与文件系统中的目录相关联。(28612132)
-
在项目导航器中的组之间拖动文件移动文件系统中的文件,并更新任何关联的SCM工作副本。
-
当组连接到文件系统中的文件夹时,创建,重命名和删除组将更新文件系统中的相应文件和文件夹。
-
要删除文件系统中的组和文件夹之间的连接,请选择组,然后打开文件检查器,然后单击清除路径按钮(X)上的。
-
要将文件系统中的文件或文件夹中的关联添加或更新到项目中的文件或组,请选择文件或组,打开文件检查器,然后将相应的文件或文件夹拖动到文件中的位置部分督察。
-
已解决的问题
-
重命名文件不再导致错误警报
The file has been saved by another application
。(31968242)
已知的问题
-
将文件从Finder中拖入项目可能会在Finder中移动或复制文件。(31042020)
解决方法:通过Command-Option创建对文件的引用,将文件拖动到项目中。
重构
已知的问题
-
通过应用修复“添加协议存根”来添加协议存根可能不会插入复杂协议的所有部分,例如
Swift.Collection
。(31078629)解决方法:使用修复按钮,然后添加任何缺少的协议存根。
-
用于局部定义类型的构造方法,例如在函数体内定义的结构,不能被重构。(31695776)
-
当提取使用本地定义类型的代码片段时,提取的函数可以将该本地定义的类型用作参数,从而导致不编译的代码。本地定义类型的示例是在函数体中定义的枚举。(32288968)
-
重命名不会影响宏扩展中找到的符号。(31989492)
-
重命名具有关联值的Swift枚举情况不会重命名其参数标签。(32126363)
-
重命名导出到Objective-C的Swift类或协议不会重命名
@class
在不包含生成的MODULE-Swift.h
标头的源文件中使用转发声明的任何引用。(32275117)解决方法: 文件中
#include
生成的MODULE-Swift.h
标题.m
。 -
重命名对成员初始化程序的调用或引用不会重命名相应的成员属性。(32383812)
解决方法:从其定义或引用中手动重命名成员属性。
-
重命名时,撤消不起作用。(32429491)
解决办法:手动编辑新名称,或使用取消。
签署和分发
新功能
-
修改分发工作流程。(29054761)
当需要新的分发签名证书时,Xcode会提示许可。可以导出签名证书以与其他团队成员共享。分发工作流不再支持撤销分发签名证书。当应用程序在构建存档时签名时,不再需要指定一个团队。
添加了对Xcode分发方法的手动签名支持。您可以在导出或上传应用时指定手动签名资产。手动创建的配置文件不会被Xcode或
xcodebuild
。在Xcode中,导出应用程序现在导出分发汇总属性列表文件,打包日志和导出选项属性列表文件。分发摘要属性列表文件描述导出的应用程序的内容,包括签名信息,符号和位码设置以及嵌入内容。包日志包含用于将归档应用程序转换为可分发打包应用程序的所有命令。
导出选项属性列表文件包括在分发工作流程中进行的所有选择,并可将其传递到
xcodebuild
使用该-exportOptionsPlist
标志。属性列表文件包括新属性(signingStyle
,signingCertificate
,和provisioningProfiles
用于指定手动签字)。查看xcodebuild -help
支持的ExportOptions
键的完整列表。增加了对
xcodebuild
使用-allowProvisioningUpdates
和-allowProvisioningDeviceRegistration
标志的自动签名的支持。增加了开发和分销签约流程,以实现持续整合 Bots可以开发应用程序在多个连接的设备上运行。对于自动签名,机器人可以注册连接的设备并更新Xcode管理的配置文件,但不能创建分发证书。
-
启用方案的测试操作的代码覆盖范围也使其可以用于运行操作。这将导致在运行操作所使用位置的两个操作中保存构建中间体和产品。(32079317)
-
添加了一个Strip Swift Symbols选项,用于控制Swift标准库中的Swift符号。有关更多信息,请参阅Xcode帮助中的构建和链接中的新增功能以及Strip Swift符号主题。(31669406)
模拟器
新功能
-
为受支持的设备添加了面朝上和面朝下的方向。(11393667)
-
更新模拟器将屏幕截图保存到系统屏幕截图目录,而不是始终将屏幕截图保存到桌面。(26127809)
-
增加了附加到从命令行启动的模拟设备的能力,并关闭模拟设备窗口,而不关闭模拟器。要使设备运行,请在关闭窗口或退出应用程序时按住Control键,然后单击出现的对话框中的Keep Running按钮。选中该复选框,使其成为关闭或退出时的默认操作。(31004084)
-
添加一个共享扩展名用于将项导入模拟器:
-
照片和视频被导入到设备的照片库中。
-
Maps.app的位置或引脚设置设备的模拟位置。
-
安装了应用程序包。
-
网址在Safari中打开。
选择所有模拟器将项目安装到所有打开的模拟器。(31150602)
-
-
通过使用硬件>音频输入和硬件>音频输出菜单,增加了对每个仿真设备选择macOS音频输入和输出设备的支持。要使用系统偏好设置中选择的Mac输入或输出设备,请从菜单中选择系统。
选择蓝牙耳机可能会通过将耳机置于通话模式来降低音频质量。如果发生这种情况,请选择其他设备。(32337249)
-
增加了对Simulator启动多个并发设备的支持,并删除了单独的Simulator(Watch)应用程序。(5687722)
-
向模拟设备添加了挡板。挡板上的按钮将相应的事件发送到模拟设备。挡板支持移动模拟设备窗口和源自屏幕边缘的设备手势。点击并拖动模拟屏幕移动窗口。移动到模拟屏幕执行一个手势。(14020158,31558767,32061265,32118310)
-
添加键盘快捷键重定向到模拟设备。选择硬件>键盘>发送菜单键盘快捷键可将发送快捷键切换到最前端的设备。每个设备的设置可能不同。有关详细信息,请选择帮助>模拟器帮助,并导航到与设备进行交互>重定向键盘快捷键。(31990219)
-
iOS 11及更高版本,tvOS 11及更高版本的更新模拟器运行时间,WatchOS 4及更高版本将文件系统视为区分大小写,以更好地模拟物理设备的行为。(18609452)
-
更新模拟器以强制执行后台执行策略,以更紧密地匹配物理设备。背景应用程序只有在适当的情况下才能执行
UIBackgroundTasks
,具有plist背景模式或接收通知。(16532261)
已解决的问题
-
当至少有一个模拟Apple TV设备时,模拟器捕获与Siri远程配对的输出。当最前面的模拟设备是Apple TV时,Siri遥控器的输出将被指向设备,否则输出将被忽略。退出模拟器将Siri遥控器的控制权返回给Mac。(29960775)
-
当启动模拟器时,如果旧版本的Simulator当前正在运行,旧版本将任何正在运行的模拟设备切换到较新版本,然后退出。(32384840)
已知的问题
-
同时运行多个模拟器可能会超过最大进程数或最大打开文件限制。当这种情况发生时,开始一个新的过程,打开一个新的模拟设备,或打开一个文件导致错误。关闭一个或多个仿真设备或关闭打开的程序可能会解决问题。
macOS 10.13及更高版本根据可用的系统内存自动调整这些限制。这些限制是早期版本的macOS的固定值。通过使用可以增加极限
launchctl
。有关详细信息,请选择“帮助”>“模拟器帮助”,然后导航到“模拟器故障排除”>“资源不足”。(31179087) -
快速连续启动许多模拟设备可能会通过使用所有系统资源来阻止新进程的产生。发生这种情况时可能没有警告。(31723508)
解决方法:关闭模拟器窗口或退出模拟器以关闭设备以立即恢复。不要强制退出模拟器,因为它不会关闭设备。有关详细信息,请选择“帮助”>“模拟器帮助”,然后导航到“模拟器故障排除”>“资源不足”。
-
通过拖动边框减少iPhone X模拟设备的大小可能会触发边缘滑动,而不是调整设备大小。(33974533)
解决办法:首先增加窗口大小,然后减小到所需的大小。
-
为模拟iPhone X选择窗口 - >缩放 - >实际大小未正确设置大小。(33908038)
解决方法:手动调整窗口的大小以正确的大小。
-
使用
xcrun simctl uninstall
在模拟器中卸载应用程序会导致故障并挂起模拟器。(30586964)解决方法:用于
xcrun simctl erase
将设备重置为初始状态,或从设备的模拟器主屏幕中删除应用程序。 -
当
AVPlayerViewController
在iPhone X模拟设备中使用时,视频可能会出现在安全区域之外,并被传感器外壳或圆角遮挡。(34339660)
源代码管理
新功能
-
“首选项”中的“源代码管理”窗格支持配置Git作者信息,Git忽略文件列表和SVN忽略文件列表。(10544339)
-
在“首选项”中更新了“帐户”窗格,以支持与GitHub的集成。作为此更新的一部分,在旧版本的Xcode中添加的存储库已不再可用。使用“源代码管理”>“克隆”访问存储库。在Xcode中注册的GitHub和GitHub Enterprise帐户的存储库出现在克隆窗口中。可以通过输入存储库URL访问其他存储库。(30191709)
-
在首选项中,添加了将“双重身份验证”和“GitHub”帐户的SSH密钥配置到“帐户”窗格的支持。执行源代码管理操作时使用凭据。(28775680)
-
添加了一个与GitHub直接集成的克隆窗口,向您显示所有帐户的最爱,私人,个人和组织资料库。每个存储库显示元数据,项目自述文件和创建存储库的本地克隆的选项。(30960520)
-
添加了一个新的Source Control导航器,用于查看项目或工作区中的工作副本。导航器列出了分支,标签和遥控器以及推拉计数。(29054970)
导航器中的上下文菜单包括以下功能:
-
创建分支和标签。
-
配置遥控器。
-
签出修订号。
-
合并分支之间的变化。
-
-
添加了一个历史记录编辑器,用于查看分支或标签的完整历史记录。每个提交包括作者,提交注释以及作为提交的一部分的任何分支或标签。单击源控制导航器中的分支或标记以显示历史记录。(29054970)
-
添加了一个评论文件编辑器来显示在提交中对文件所做的更改。(29054970)
-
添加了一个源代码管理检查器来显示提交的更多细节。(29054970)
-
更新Xcode以自动获取远程跟踪分支,在项目导航器中标记更新的文件,并在“源代码管理”导航器中显示推拉计数。(31839384)
-
githum.com在网络浏览器中的存储库中添加了对一次性克隆到Xcode的支持。(32294826)
已知的问题
-
执行某些源代码控制操作(例如拉动)时,历史记录视图中可能不会显示最新更新。(33919644)
解决方法:打开历史记录视图,选择编辑器>刷新历史记录。
-
使用除Xcode之外的工具删除在Xcode中添加的GitHub帐户的钥匙串凭据可防止Xcode显示身份验证错误。(33898250)
解决方法:删除Xcode中的GitHub帐户,然后添加它。
弃用
-
Subversion集成在将来的版本中将被废弃。(33041914)
源代码编辑器
新功能
-
Command-plus(+)和Command-minus( - )现在增加和减少源编辑器中字体的大小。(21423189)
-
在所选文本中键入开头分隔符将在选择结束时添加一个匹配的关闭分隔符。自动匹配的分隔符包括双引号(
"
),括号(“(
”和“)
”),方括号([
和]
)和大括号({
和}
)。(29164633) -
注释和取消注释功能现在可以正常支持支持嵌套块注释的语言,例如Swift,以及其他不支持嵌入块注释的语言,例如C。这将导致更准确的注释和取消注释。(32193940)
已知的问题
-
使用VoiceOver将连接从Interface Builder拖到源编辑器有时无法创建连接。(33198923)
解决方法:声明
IBAction
或IBOutlet
在源代码编辑器中,然后将连接从源代码编辑器拖到Interface Builder。
迅速
新功能
-
更新Xcode以支持Swift 4.0和Swift 3.2。语言模式由Swift语言版本构建设置控制。这两种语言模式是使用相同的编译器和标准库实现的,它可以使用Swift 3将目标使用Swift 3与目标进行连接,从而在大多数情况下,可以在目标目标上实现从Swift 3.2迁移到Swift 4基础。
虽然Swift 3.2和Swift 4.0旨在兼容,但它们访问Cocoa和Cocoa Touch API的差异可能会导致不一致,这可能限制了使用另一个版本构建的客户端目标可以使用一个版本构建的库。最常见的问题是缺少类型的成员; 在某些情况下,客户端可能会被禁止对特定类进行子类化或采用某些协议。
Swift 3.2和Swift 4.0不支持与3.2之前版本的Swift编译的目标链接。
像往常一样,如果编译器或SourceKit崩溃,请提交一个错误报告,附上您的项目和源。如果您在项目中混合Swift 3和Swift 4,请在问题描述中提及。(31104045)
-
在修改变量时对其进行第二次访问是一个错误。这样的访问导致程序员和编译器难以理解的代码。一般来说,您需要重新排列代码(例如,通过制作本地副本)来防止冲突的访问。
例如,以下代码尝试从变量数组中读取时,该
sort()
方法正在进行变异。var array:[Int] = ...
array.sort {$ 0 <array [0]} //错误
此规则通过编译时和运行时检查的组合来实现。
静态检查用于大多数局部变量,常量和参数。在Swift 4模式下,静态故障是编译时错误。在Swift 3模式下,静态故障是一个警告,但是在将来的Swift版本中会出现一个错误,所以您应该修复这些警告。
动态检查用于在
@escaping
闭包中捕获的全局变量,静态类型属性,类实例属性和局部变量。在Swift 4模式下,失败的动态检查会导致运行时陷阱,就像整数溢出一样。在Swift 3模式下,失败的动态检查会导致警告打印到stderr。编译时和运行时检查对同一个线程中发生的访问执行规则。线程消毒器可以捕获从不同线程发生的大多数(但不是全部)违规。
使用交换交换集合的两个元素的常见成语违反了此规则。为了支持这种模式,现在有
swapAt(_:_:)
一种所有可变集合的方法。(SE-0176) -
在Swift 4.0中,同一文件中的扩展名和扩展相同类型的扩展名共享一个访问控制范围。如果它们扩展的类型也在同一个文件中,它们共享其访问控制范围。这意味着在类型声明中声明的私有成员可以从扩展名访问,并且可以从其他扩展名和类型的声明访问在一个扩展名中声明的私有成员。(SE-0169)
-
现在可以编写多行字符串文字。A
"""
之后是新行开始文字,"""
一行在新行结束。初始报价后的每一行必须以与结束报价相同的空格开头,这将在编译时被删除。(SE-0168) -
SQLite API现在可以以模块名称导入Swift
SQLite3
。(18640410) -
在Swift 4.0中,如果Objective-C类具有无法导入到Swift中的指定的初始化程序,则该类的所有Swift子类将不会继承任何方便的初始化程序。(31563662)
-
所有核心基础类型的隐含顺应
Equatable
和Hashable
协议斯威夫特3.2和4.0。(SR-2388)如果您以前在扩展中添加了这些符合条件,请使用以下模式来限制扩展:
#if swift(> = 3.2)
// Swift提供了相当可靠的Hashable。
#其他
扩展 TheCFTypeICareAbout:Hashable {
static func ==(左:TheCFTypeICareAbout,right:
TheCFTypeICareAbout) - > Bool {
返回 CFEqual(左,右)
}
var hashValue:Int {
返回 CFHash(自)
}
}
#万一
-
现在可以将下标声明定义为具有通用参数列表。(SE-0148)
扩展名 MyContainer {
下标 <T:MyKeyConvertible>(key:T){...}
}
-
协议组合类型现在可以包含一个或多个类类型术语,形成类约束协议组合。(SE-0156)
协议可绘制{
func油漆()
}
Canvas 类
var origin:CGPoint
}
class Wall:画布,可绘制{
func paint(){...}
}
func render(_:Canvas&Paintable){...}
渲染(长城())
类别约束的协议组合可以在Swift 3和Swift 4模式下编写和使用。
用于Swift API的生成头部将类别约束的协议组合映射到Swift 3和Swift 4模式中的Objective-C协议限定类类型,例如,
NSSomeClass & SomeProtocol & OtherProtocol
在Swift中,将成为NSSomeClass <SomeProtocol, OtherProtocol>
Objective-C。UIViewController<UITableViewDataSource, UITableViewDelegate>
在Objective-C中类似的变成UIViewController & UITableViewDataSource & UITableViewDelegate
Swift。使用协议限定类类型的Objective-C API在以Swift 3模式和Swift 4模式编译的模块导入时的行为不同。在Swift 3模式下,这些API将继续导入作为协议组合而没有类约束 - 例如
SomeProtocol & OtherProtocol
。在Swift 4模式下,协议限定类类型导入为类受约束的协议组合,用于从Objective-C到Swift的API的更准确映射。目前实施类受约束的协议组合缺乏Swift进化计划中概述的三个特征:
-
在进化提议中,只要一个是另一个的超类,则允许类约束的协议组合包含两个不同的类。当前实现只允许多个类出现在组合中,如果它们相同。
-
在进化建议中,关联类型和类继承子句被推广以允许类约束的协议组合。目前的实现不允许这样做。
-
在演进建议中,协议继承子句允许包含一个类,要求所有符合类型都是给定类的子类。目前的实现不允许这样做。
该提案的这些缺失的方面可以在将来的版本中引入,而不会破坏与现有代码的源兼容性。
-
-
一个新的整数协议族支持更通用的算法:
-
Numeric
,支持算术运算符的类型 -
BinaryInteger
,具有二进制表示并支持按位操作的整数类型 -
FixedWidthInteger
,使用固定大小的整数类型,并支持报告溢出的算术运算的概念
现在允许进行非均匀比较,无需进行
numericCast(_:)
比较。例如,(42 as UInt) > (0 as Int)
作品。随着智能班次的引入,可以将值移位负数,或者转移不同整数类型的值而不调用
numericCast(_:)
。结果类型是移位值的类型。toIntMax()
并init(_:IntMax)
已被弃用 -numericCast
直接在不同整数类型之间转换,而不经过最大宽度整数。(SE-0104) -
-
Sequence
具有Element
相当于的相关类型Iterator.Element
。该关联类型的值可以从现有Sequence
一致性推断出来。已声明某种类型的代码Element
可能需要更改才能解决冲突。(32186094) -
切片原始缓冲区不再会导致相同的原始缓冲区类型。具体来说,
UnsafeBufferPointer.SubSequence
现在具有RandomAccessSlice<UnsafeRawBufferPointer>
与可变版本相同的更改类型。因此,索引到原始缓冲区切片不再是基于零的。原始缓冲区完全符合通用要求Collection
。(SE-0138)将缓冲区中的区域传递到另一个占用缓冲区的函数,不能再通过下标完成。这需要显式初始化,使用一个
rebasing:
初始化器,它从一个切片转换为一个零Unsafe[Mutable]RawBufferPointer
:takeRawBuffer(buffer [i .. <j])//不正确
takeRawBuffer(UnsafeRawBufferPointer(rebasing:buffer [i .. <j]))//正确
不能直接从缓冲区中完成下标分配。这需要从完整的源缓冲区创建切片:
buffer [n .. <m] = small_buffer //不正确
buffer [n .. <m] = smaller_buffer。[0 ...] //正确
切片类型
UnsafeRawBufferPointer
不再具有非定位下标设置器。所以分配到一个可变的let
缓冲区不再编译。分配的缓冲区片段现在需要是一个var
。//不正确
let slice = buffer [n .. <m]
slice [i .. <j] = buffer [k .. <l]
//正确
var slice = buffer [n .. <m]
slice [i .. <j] = buffer [k .. <l]
-
可以从一系列键和值创建字典,并可以将键和值合并到现有的字典中。(SE-0165)
let asciiTable = Dictionary(uniqueKeysWithValues:zip(“abcdefghijklmnopqrstuvwxyz”,97 ...))
// [“w”:119,“n”:110,“u”:117,“v”:118,“x”:120,“q”:113,...]
让蔬菜= [“番茄”,“胡萝卜”,“洋葱”,“洋葱”,“胡萝卜”,“洋葱”]
var vegetableCounts = Dictionary(zip(vegetables,repeatElement(1,count:Int.max)),uniquingKeysWith:+)
vegetableCounts.merge([(“tomato”,1)],uniquingKeysWith:+)
// [“番茄”:2,“胡萝卜”:2,“洋葱”:3]
-
过滤一组字典会产生与接收器相同类型的结果。要转换字典的值,保留相同的键,请使用该
mapValues(_:)
方法。(SE-0165)let元音:Set <Character> = [“a”,“e”,“i”,“o”,“u”]
让 asciiVowels = asciiTable.filter({vowels.contains($ 0.key)})
asciiVowels [“a”] // 97
asciiVowels [“b”] // nil
让 asciiHexTable = asciiTable.mapValues({“0x”+ String($ 0,radix:16)})
// [“w”:“0x77”,“n”:“0x6e”,“u”:“0x75”,“v”:“0x76”,“x”:“0x78”
-
当使用键作为字典下标时,如果键不存在于字典中,则可以提供要返回的默认值。(SE-0165)
对于蔬菜在 [“番茄”,“菜花”] {
vegetableCounts [veg,default:0] + = 1
}
// [“番茄”:3,“胡萝卜”:2,“洋葱”:3,“花椰菜”:1]
-
添加了一个
init(grouping:by:)
初始化器Dictionary
,将数组或其他序列转换为字典,按特定特征分组。(SE-0165)let buttons = ... //一个按钮实例的数组
let buttonsByStatus = Dictionary(分组:buttons,by:{$ 0.isEnabled})
//启用了多少按钮?
print(“Enabled:”,buttonsByStatus [ true ] ? .count ?? 0)
-
Dictionary
并Set
具有类似的可见capacity
属性和reserveCapacity(_:)
方法Array
,字典的键和值属性由专门的集合表示。(SE-0165) -
Substring
为Swift 4 添加了一种新的类型,在切片时返回String
。(SE-0163)在Swift 3.2中,切片a
String
继续返回String
,但您可以提供类型上下文来获取Substring
- 例如myString[i...] as Substring
。Substring
呈现出几乎相同的APIString
。一个新的协议,StringProtocol
可用于编写适用于String
或任何一个的通用代码Substring
。 -
String
现在符合BidirectionalCollection
和RangeReplaceableCollection
。(SE-0163) -
RangeExpression
现在使用一个新的协议来统一所有范围类型(例如CountableRange
和ClosedRange
),并添加了新的单面范围(如PartialRangeUpTo
)。(SE-0172)任何符合的类型
RangeExpression
现在可以用来分割一个集合。let numbers = [10,20,30,40,50,60]
如果 let i = numbers.index(of:40){
打印(数字[.. <I])
}
//打印“[10,20,30]”
可计数部分范围可用作序列。
let alphabet =“ABCDEFGHIJKLMNOPQRSTUVWXYZ”
让 asciiTable = zip(65 ...,字母表)
for(code,letter)in asciiTable {
打印(代码,信件)
}
//“65 A”
//“66 B”
//“67 C”
// ...
//“89 Y”
//“90 Z”
-
NSNumber
对于将其某些值交叉到相应的Swift值类型的结果更严格。具体来说,如果存储的值不符合请求的Swift值类型,则使用转换
as?
返回。例如,返回,但返回。nil
NSNumber
NSNumber(2) as? Bool
nil
NSNumber(1) as? Bool
true
要忽略此行为并强制转换,请改用相应的转换方法
NSNumber
。例如,myNumber.boolValue
。(SE-0170) -
档案和序列化API内置于Swift,重点是从外部格式直接转换为本机Swift类型的类型安全转换,以及与常规格式(如JSON和属性列表)的互操作性。的
Encodable
和Decodable
协议(沿Codable
,这意味着这两者),允许类型参加编码和解码的机制。(SE-0166)许多基本数据类型符合
Codable
。成员都遵守的自定义数据类型Codable
可以通过声明协议一致性来使用这些协议的编译器生成的实现。public struct Person:Codable {
let name:String
让电子邮件:String
}
-
更新
Encoder
和Decoder
转换为JSON和属性列表格式的类型安全转换。结合默认Codable
实现,许多类型可以本地转换为和从这些格式转换,没有额外的编码或解码工作。(SE-0167)进口基金会
让 johnny = Person(名称:“Johnny Appleseed”,电子邮件:“johnny_appleseed@apple.com”)
let encoder = JSONEncoder()
let data = try encoder.encode(johnny)
// data is {“name”:“Johnny Appleseed”,“email”:“johnny_appleseed@apple.com”}
让解码器= JSONDecoder()
让人= 尝试 decoder.decode(人,自我,自:数据)
打印(person.name)
//打印“Johnny Appleseed”
-
Swift 4增加了对类型安全的关键路径文字的支持。它们使用如下所示的语法形成:
\BaseType.propertyName
。反斜杠很重要:它消除了属性的关键路径,并简单地访问属性。当基础类型可以被推断时,可以避免产生如下所示的表达式:\.propertyName
。密钥路径表达式从KeyPath
下面列出的类型的层次结构中生成实例,BaseType
基础的动态类型以及PropertyType
命名属性的类型:-
KeyPath<BaseType, PropertyType>
- 只读密钥路径 -
WritableKeyPath<BaseType, PropertyType>
-读/写,可直接变异值类型关键路径,类似inout
和mutating
-
ReferenceWritablePath<BaseType, PropertyType>
- 读/写密钥路径,可以引用引用类型
这些新的关键路径与
#keyPath
去年引入的现有字符串表达式一起存在。#keyPath
仍然可用于String
基于遗留的API。(SE-0161) -
-
在Swift 4模式中,类型系统正确地区分了使用一个元组参数的函数,以及采用多个参数的函数。([ SE-0110 ])
Swift编译器
新功能
-
在Swift 4模式中,一个声明被推断为
@objc
编程模型语义一致性所需的声明。具体来说,在以下情况下推断:-
该声明是一个覆盖
@objc
声明 -
该声明满足
@objc
协议中的要求 -
声明具有以下属性之一:
@IBAction
,@IBOutlet
,@IBInspectable
,@GKInspectable
,或者@NSManaged
另外,在Swift 4模式下,
@objc
需要明确标记不基于上述规则推断的动态声明@objc
。Swift 3.2保留了更广泛的Swift 3规则,用于推断@objc
子类NSObject
。但是,编译器发出警告有关在何处被用于这些推理情况下,Objective-C的条目点的地方,例如在一个#selector
或#keyPath
通过表达,经由消息收发AnyObject
,或混合夫特和Objective-C项目内Objective-C代码直接使用。警告可以通过添加一个显式来保持沉默@objc
。通过设置环境变量,可以在运行时诊断这些不是编译器静态可见的入口点的使用SWIFT_DEBUG_IMPLICIT_OBJC_ENTRYPOINT
到1到3之间的值,然后测试应用程序。(SE-0160) -
-
Swift编译器诊断尝试
NSCoding
与不具有简单Objective-C运行时名称的类一起使用。这些类的名称可能会受到不相关的更改的影响。例如,私有类的运行时名称取决于包含源文件的名称。或者,使用该@objc
属性来显式指定运行时名称。如果您将类归档到其当前的“mangled”名称下,编译器将提供一个修复程序来使用它。(32314195) -
协议和关联类型现在可以包含
where
对关联类型提供额外限制的子句。(SE-0142)协议 StringRepresentable:RawRepresentable 其中 RawValue == String {}
协议 RawStringWrapper {
关联类型包装:RawRepresentable 其中 Wrapper.RawValue == String
}
-
Swift编译器现在在Swift完成解析桥接头之后导入子模块时,懒惰并隐式导入外部模块。这是以前版本的行为变化,导致热切地进口。因此,一些可能依赖于真正隐式导入的桥接头(例如通过直接使用在外部模块中定义的类型)将不再编译; 他们将需要转发声明这样的定义或明确导入外部模块。(30615193)
-
为了在将来的Swift版本中将默认参数表达式嵌入到调用者中,它们不得引用任何比封闭函数更少访问权限的声明。(32189807)
//之前
private func computeTheBestInteger() - > Int {
返回 4
}
public func useAnInteger(_ x:Int = computeTheBestInteger()。absoluteValue){
打印(X)
}
有多种方法可以修改现有代码以满足此条件:
-
将非公开参考更改为公开。
public func computeTheBestInteger() - > Int {
返回 4
}
public func useAnInteger(_ x:Int = computeTheBestInteger()。absoluteValue){
打印(X)
}
-
添加一个帮助函数。
private func computeTheBestInteger() - > Int {
返回 4
}
public func defaultXForUseAnInteger() - > Int {
return computeTheBestInteger()。absoluteValue
}
public func useAnInteger(_ x:Int = computeTheBestInteger()。absoluteValue){
打印(X)
}
-
使用哨兵值。
private func computeTheBestInteger() - > Int {
返回 4
}
public func useAnInteger(_ xOrNil:Int?= nil){
让 x = xOrNil?(computeTheBestInteger()。absoluteValue)
打印(X)
}
-
-
编译器现在可以警告单个表达式需要很长时间才能键入检查。
要启用此警告,请转到构建设置,Swift编译器 - 自定义标志,其他Swift标志,并添加
-Xfrontend -warn-long-expression-type-checking=<limit>
标志,其中<limit>是表达式必须执行的毫秒数的下限,以便为发出警告。这允许用户识别那些对构建时间有显着贡献的表达式,并通过拆分或添加类型注释来重新构建它们,以尝试减少在这些表达式上花费的时间。(32619658)
已解决的问题
-
Swift整数值可以用作
NSDictionary
与NSNumber
键盘桥接的索引。(SR-3172) -
将nil分配给具有
ImplicitlyUnwrappedOptional
类型的延迟属性时,该值被正确设置为nil
。(32778003) -
现在完全支持类中的协变方法覆盖,在定义或调用这些方法时修复许多崩溃和编译时断言。(SR-1529)
班床{}
一流的Nook:床{}
猫类 <T> {
func吃(小吃:T){}
func play(game:String){}
func sleep(其中:Nook){}
}
类狗:猫<(Int,Int)> {
//'T'变得具体
覆盖 func吃(小吃:(Int,Int)){}
//'game'成为可选的
覆盖 func play(游戏:String?){}
//'where'成为超类
覆盖 func睡眠(其中:床){}
}
已知的问题
-
当预编译桥接头构建设置打开时,Framework目标中的某些头文件配置可能会导致编译器错误地读取标题两次,这两个作为模块的一部分和独立的非模块化标头。这可能导致关于重复的Objective-C定义的警告,并且由于Swift模块文件之间的错误交叉引用,最终编译失败或编译器崩溃。(33837253)
解决方法:将预编译桥接头构建设置更改为“受影响的目标”。
-
如果Swift类在暴露给Objective-C的方法中使用比其部署目标更新的类型,则
MyApp-Swift.h
由于Swift编译器不包括可用性信息,所以生成的标题将会有关于“partial”类型的警告。(33313703)解决方法:
-Wunguarded-availability-new
每当包含生成的标题时,请关闭警告。#pragma clang诊断推
#pragma clang diagnostic ignored“-Wungguarded-availability-new”
#include“MyApp-Swift.h”
#pragma clang诊断弹出
-
当子类中的方法旨在匹配超类采用的协议中的可选方法时,Swift编译器不会产生警告。例如,如果超类符合
UITableViewDelegate
,并且子类声明一个方法不正确地命名tableView(_:editingStyleForRowAtIndexPath:)
而不是tableView(_:editingStyleForRowAt:)
编译器将不会警告它。另外,如果Swift 3风格推断@objc
关闭,方法将不会在运行时被调用。请务必仔细检查这些方法。(30489065,SR-3943) -
当预编译桥接头构建设置打开时,Swift编译器将不再自动读取与桥接头相同的目录中的模块映射文件。这可能导致表单错误
module ‘TheModule’ not found
。(32810754)解决方法:如果需要从此目录读取模块映射,请将其作为显示搜索路径添加到用户头搜索路径构建设置下。
-
尝试使用来自Swift的Accelerate框架可能会生成关于缺少simd符号的链接器错误,例如
error: Couldn't lookup symbols: __T04simd6float4VN
(32457742)解决方法:添加
import simd
到Swift文件。 -
当在主应用程序目标之外使用时,图像文字导致立即运行时退出。(26873717)
解决办法:继续使用
NSImage
或UIImage
API在非应用程序目标中创建映像。
Swift包管理器
新功能
-
软件包
Package.swift
文件中使用的软件包manifest API 已得到改进。创建一个新的软件包或使用package manager命令swift package tools-version --set-current
来选择新的API。软件包仍然可以使用以前的清单格式。(SE-0158,SR-3949) -
增加了对包中源文件的自定义目录布局的支持。包中的每个目标可以指定包含该目标的源文件的目录的路径。(SE-0162,SR-29)
-
将C目标的默认链接更改为静态链接。链接选项通过在指定库产品的类型时传递
.static
或.dynamic
情况在包清单中进行控制。(29730882) -
增加了对软件包的支持,以显式声明软件包向客户端发送的产品。以前,产品根据包装中的目标进行推断。(SE-0146,SR-3606)
-
更新了许多软件包管理器问题的错误消息,以便更清晰,更详细。(29772725)
-
swift package edit
在将软件包置入编辑模式之前,通过解析软件包依赖关系,在更改之前更新了检测依赖关系解决错误的命令。(29772779) -
软件包相关性现在可以引用分支名称而不是标记的版本。只有当包与其所有客户端紧密耦合时,才使用命名分支作为包依赖关系。包的标签版本不能取决于任何分支。(SE-0150,SR-666)
-
添加了
--path
该swift package edit
命令的选项,通过挂起远程包的自动检出管理来支持相关套件集的“顶级树”开发。这样可以迭代一个包和其中的几个依赖关系,而无需提交和标记这些更改来查看整体结果。(SE-0149,SR-3709) -
--branch
将swift package edit
命令的选项更改为可选项。如果没有提供分支,Git信息库将被置于“分离的HEAD”状态。(30120243) -
软件包可以声明使用该软件包所需的Swift工具所需的最低版本。(SE-0152)
-
在macOS上构建软件包只需要安装Command Line Developer Tools。以前,需要安装Xcode。运行单元测试仍然需要Xcode。(30813768)
-
由包管理器生成的更新的Xcode项目为对象(如目标)使用稳定且可读的对象标识符,允许Xcode方案继续引用相同的对象,即使项目使用修改内容重新生成。(31019219)
-
更新的包清单解释和包构建在macOS上,以使用沙箱,从而防止网络访问和文件系统修改。这有助于减轻恶意制作的清单的影响。(31107213)
-
更新了新的克隆的MacOS的依赖关系,以便使用只读文件权限,从而降低无意更改的风险。当软件包进入编辑模式时,会为该软件包中的文件添加写入权限。(31286403)
-
通过在
LinuxMain.swift
包含测试目标目录的所有目录层次结构中进行搜索,在Linux上更新了自定义目录布局的支持。搜索继续到包根目录。(31585721) -
通过
Package.pins
使用新Package.resolved
文件替换文件来更新依赖关系解析。新文件包含已解析的依赖关系版本,在更多情况下可以自动发生依赖关系重新分辨。使用包提交文件以使用依赖关系解析的新方法。另外,resolve
命令swift package
替换fetch
命令。(SE-0175) -
添加了一个预发布语义版本控制组件来打包版本标签。(SR-1039)
-
默认情况下,软件包相关性并行克隆。(32286386)
-
将包
cLanguageStandard
和cxxLanguageStandard
属性添加到包中,以指定在编译C和C ++目标时使用哪种语言标准。(SE-0181)
已解决的问题
-
Package.swift
在从Swift包生成的Xcode项目中编辑清单时,代码完成现在可以工作。(33284557)
已知的问题
-
使用新选项创建静态可执行文件
--static-swift-stdlib
无法正常运行。(33861492)解决方法:使用以下命令构建软件包:
swift build -Xswiftc -static-stdlib
。
Swift SDK
新功能
-
改变
NSFastEnumerationIterator
从一个class
到struct
。直接使用的现有代码NSFastEnumerationIterator
可能需要切换到使用avar
而不是alet
。(30905263)
已解决的问题
-
快速导入ModelIO框架但不使用它的Swift应用程序将在不包含框架的操作系统版本上正常启动。(33471433)
已知的问题
-
以下AVFoundation API暂时不可用(34378539):
-
AVCaptureDevice.Format.supportedColorSpaces
-
AVCaptureDevice.supportedFlashModes
-
AVCapturePhotoOutput.availablePhotoPixelFormatTypes
-
AVCapturePhotoOutput.availableRawPhotoPixelFormatTypes
-
AVCapturePhotoSettings.availablePreviewPhotoPixelFormatTypes
-
快速迁移
已知的问题
-
一些API已经更改为接受
[NSAttributeKey: Any]
字典而不是[String: Any]
,例如NSString.size(withAttributes:)
和NSString.draw(at:withAttributes:)
。这些更改可能会在迁移完成后产生错误。(32431618)解决方法:更改类型以匹配变量声明中的预期参数。
-
当
Dictionary
有一个NSAttributedStringKey
as key使用一个String
索引时,编译器可能会返回一个错误形式:error: ambiguous reference to member 'subscript'
。(32432013)解决方法:用键盘对象包装
NSAttributedStringKey(rawValue: ... )
-
迁移者没有正确处理API改变可空性并且
if let
语句的右侧变为不可选的情况。这将产生错误,如:错误:initializer for conditional binding must have Optional type, not '<TYPE>'
。(32476453)解决方法:更改
if let
语句以使其作为赋值let
。
模板
新功能
-
更新了新文件的模板宏扩展。改进包括:
-
添加
FILEHEADER
了一个用于标准文件头注释内容的新宏。 -
宏的内容可以使用其他宏定义。例如,
FILEHEADER
宏是使用其他宏定义的,例如FILENAME
和COPYRIGHT
,并COPYRIGHT
使用ORGANIZATIONNAME
和定义YEAR
。 -
宏扩展可以包括修饰符。
-
可以覆盖默认宏并提供自定义的宏。
有关更多信息,请选择帮助> Xcode帮助并导航到附录>文本宏。(5775785)
-
测试
新功能
-
xcodebuild
运行测试时不再启动模拟器。(27385435) -
为XCTest添加了一个拆卸块API,用于在完成测试状态后进行清理。(28097197)
-
在XCTest
XCUIElement
之前添加了一个API来等待存在,然后继续。(28483267) -
增加了对XCTest的支持,用于在单个UI测试中定位多个应用程序。这包括监视应用程序状态并使后台应用程序成为最前沿的应用程序。(28948745)
-
与特定类密切相关的XCTest类型,例如
XCUIElement.Type
Swift 4中的嵌套类型。(29000570) -
添加
XCTActivity
了一个新的API,用于将UI测试活动分组在测试报告和日志记录中。(30401267) -
添加
XCTAttachment
了一个用于捆绑诊断测试资源的新API,例如丰富的日志记录,并带有测试结果。(30478677) -
xcodebuild
默认情况下同时测试多个目的地。使用-disable-concurrent-testing
命令行参数来禁用并发测试。(31964004) -
将自动捕获的截图的保存格式更新为JPG。(32719585)
-
为XCTest添加了新的API来管理截图,包括禁用自动屏幕截图的方案级配置选项,以及捕获部分,单个或多个显示屏幕截图。(21327915)
-
更新UI测试,以支持基于LSUIElement的应用程序。(21344280)
-
当Xcode构建和安装应用程序时,提高UI测试的性能。还添加
firstMatch
了限制UI测试中的查询执行。(29544176,22980005) -
添加了用于测试Xcode方案的语言和区域特定配置。(28897796)
已解决的问题
-
NSUInteger
在XCTest API中导入到Swift 4Int
而不是UInt
使其与其他系统框架一致。(29589664) -
UI测试期间的测试断言总是导致XCTest捕获屏幕截图。(28853076)
已知的问题
-
当测试在模拟器中运行时,Xcode不会显示一些测试失败的正确文件和行信息。(33810627)
-
xcodebuild test
可能间歇性地失败并出现错误。(32881403,32836473,29122169,33354498,32852527)。错误包括:
-
Launch session expired before checking in
-
Early unexpected exit, operation never finished bootstrapping - no restart will be attempted
-
App accessibility isn't loaded
-
Domain=XCTestManagerErrorDomain Code=12 "Failed to get main window after 30 retries"
-
Error Domain=DTServiceHubClient Code=–11 "unable to contact local DTServiceHub to bless simulator connection"
-
Test runner failed to initialize for UI testing but did not provide any additional details
解决方法:再次尝试运行测试。
-
-
当在MacOS High Sierra上运行并行测试时,
xcodebuild test
有时会变得无响应。(33206730)解决方法:使用Control-C取消测试并重试测试。或者,通过使用
-disable-concurrent-testing
标志来禁用并行测试。 -
testmanagerd
意外退出,Assertion failed: (staticHeader.header_magic == DTX_MESSAGE_MAGIC)
导致运行xcodebuild test
失败的结果出错。(33470538)解决方法:再次尝试测试。
螺纹消毒剂
新功能
-
更新的Thread Sanitizer可以在Objective-C和Swift集合上捕获更高级别的比赛,例如在不使用正确同步的情况下,从不同的线程写入可变数组。(26798589)
-
更新的线程消毒器可以捕获更多的跨线程违反Swift规则,这需要独占访问内存。例如,当多个线程在不同步的情况下调用同一结构上的突变方法时。(30455576)
工具链
弃用
-
新的构建系统不再与旧版本一起运行shell脚本构建阶段
COMMAND_MODE
。这导致实用程序,例如echo
符合单一UNIX规范的版本3。(33875525)
未定义行为消毒剂
新功能
-
添加了Undefined行为Sanitizer,一种新的低开销运行时工具,可以使用C语言查找多种类型的未定义行为,例如整数溢出,无效的转换和对齐违规。未定义的行为清除剂在Scheme编辑器的Diagnostics选项卡中启用,并与所有其他消毒剂兼容。(15425728)
-
在运行时添加了可空性注释违规的可选检测。通过将启用无效性注释检查设置为是,通过“构建设置”的“未定义行为清理程序”部分启用该功能。(30619298)
Xcode服务器
新功能
-
增加了对多个设备和模拟器并行运行测试到Xcode Server的支持
xcodebuild
。Bots可以配置为启用或禁用设备上的并行测试,默认为并行测试。xcodebuild
并行运行测试时产生的输出已更新,依赖于输出格式的任何自动化工具可能需要更新。(14254639) -
增加了对自动和手动配置配置的支持。服务器可以由更新的bot编辑器由开发人员团队的代理或管理员添加。需要手动指定证书或配置文件的方案可以从机器人编辑器中的新“签名”选项卡与服务器共享。(15437174)
-
更新了Xcode Server以支持配置
xcodebuild
在集成运行时传递给的其他参数。(23578597) -
向Xcode服务器添加双因素身份验证。这可以在将服务器加入开发团队时使用,并且不需要使用特定于应用程序的密码。(27002415)
-
当所有由机器人追踪的问题都得到解决时,增加了发送“全部清除”电子邮件通知。(26179348)
-
Xcode服务器不再需要macOS Server应用程序。在Xcode首选项的“服务器和博客”选项卡中配置您的服务器和漫游器。(28211693)
-
更新机器人以运行特定语言和地区的测试。(30382604)
-
更新的bot配置包括一个可选的Export Options Plist,用于配置从存档导出可安装产品。(31895193)
已解决的问题
-
复制,粘贴和cmd + F现在可以按照预期在集成报告的日志选项卡中正常工作。(14140192)
-
Xcode服务器日志现在支持复制和粘贴。(26605066)
-
安装新版本的Xcode后升级集成运行时,Xcode Server会正确显示SDK版本中的任何更改。(30983641)
已知的问题
-
使用Xcode Server对网络设备进行测试在使用不同的构建服务用户帐户初始化Xcode Server时不起作用。(33904987)
解决方法:在初始化Xcode Server时,选择构建服务用户的主用户帐户。
-
在使用Xcode 9配置Xcode Server后删除Server.app将会停止Xcode Server服务。(31820819)
解决方法:不要删除Server.app,或者从Server&Bots首选项窗格或使用
xcscontrol
命令行工具重新启动Xcode Server之后。 -
尝试编辑Xcode Server bot可能会错误地显示错误,
does not match this workspace
即使是这样。(31957021)解决方法:关闭对话框。
-
当Xcode Server配置为使用后台用户帐户执行集成时,UI测试期间,截图可能并不总是被捕获。(34213968)
弃用
-
Xcode服务器不再包含托管Git存储库。要继续使用在macOS Server中设置的存储库,请配置一个新的远程Git服务器并将代码推送到该远程。升级到Xcode 9后,任何现有的存储库都将被存档
/Library/Developer/XcodeServer/HostedRepositories
。(31243129)