前言
本期是 Swift 修正组整理周报的第四十一期,每个模块已开端成型。各位读者假如有好的提议,欢迎在文末留言。
Swift 周报在 GitHub 开源,欢迎提交 issue,投稿或引荐内容。现在计划每两周周一发布,欢迎情投意合的朋友一同加入周报整理。
日子的充足并非白璧无瑕,恰当的缺憾更能感受幸福。Swift社区邀你一同,保持积极向上的心!
周报精选
新闻和社区:现推出超越 30 个新的开发者活动
提案:大局变量的严厉并发性
Swift 论坛:Swift 6 言语形式的开展
引荐博文:Swift 中的溃散回溯
论题评论:
假如公司在市中心,你会挑选那种办法?
上期论题成果
依据投票成果分析,极兔速递的 IPO 在受众中引起了恰当的关注。顺丰和京东物流依然是物流行业备受看好的龙头企业,分别占有恰当大的份额。菜鸟虽然有一定支撑,但在此次投票中体现相对较弱。
新闻和社区
2024 年 Swift Student Challenge 发布
Apple 很自豪能够支撑和鼓励下一代学生开发者、创作者和企业家。挑战赛为数以千计的学生供给了机会,让他们能够展示自身的创造力和编程才能,并培养能够在职业生涯和更多当地运用的实践技能。从协助伙伴找到合适的心理健康资源,到发现在校园内支撑可持续开展作业的办法,Swift Student Challenge 参赛者将发挥他们的创造力,经过开发 App 来处理他们关注的问题。
咱们发布了新的编程资源、与社区合作伙伴积极合作,并且比从前更早发布了挑战赛,以便学生们能深化研讨 Swift 和整个开发进程,一起教育作业者也能抢先一步为他们供给支撑。
请求将在 2024 年 2 月敞开三周。
2024 年挑战赛新增了一项机制,咱们将在 350 名获奖者中选出 50 名出色获奖者,并对这些提交了优异作品的出色获奖者予以表彰,约请他们下一年夏天前往坐落库比提诺的 Apple 园区度过难忘的三天。
现推出超越 30 个新的开发者活动
2023 年 11 月 7 日
预备好提升你的 App 或游戏功用了吗?在整个 11 月和 12 月,欢迎参与面向全球开发者量身打造的一系列面对面或在线举办的全新实验室、咨询和讲座等活动。
你将能探究:
App Store 活动:了解关于探究、互动、App 内活动、自定产品页面、订阅引荐做法等很多精彩内容。 Apple Vision Pro 开发者实验室:请求参与坐落库比提诺、伦敦、慕尼黑、纽约、上海、新加坡、悉尼或东京的实验室。
Apple Vision Pro 活动:了解怎么为 visionOS 规划和构建全新的 App 和游戏世界。
规划和技能咨询:报名获取关于 App 规划、技能施行等方面的一对一辅导。
探究在多个时区以多种言语进行的活动。
提案
正在查看的提案
SE-0412 大局变量的严厉并发性 提案正在查看。
该提案界说了在不产生数据竞赛的状况下运用大局变量的选项。在此提案中,大局变量涵盖任何静态持续时刻的存储:在大局规模声明的 let
和存储 var
,或许作为静态成员变量。
Swift论坛
自上次更新为 Swift 6 言语形式 94 拟定规划优先事项以来,该项目一直在稳步推动,朝着这个下一个里程碑跨进。但是,从前提出的一些方针包括尚处于敞开式研讨阶段的问题。在 Swift 6 的作业开展的一起,言语辅导组正在将 Swift 6 剩下变更的要点缩小到默认状况下的数据竞赛安全。
数据竞赛安全的预备状况
在严厉的并发查看下,Sendable 查看模型中仍存在许多过错和缝隙,答应数据竞赛。相同重要的是,严厉的并发查看现在会宣布很多过错报告数据竞赛,使得完好的查看难以进行编程。
只有当言语辅导组确认编程模型是有效和可用的时,Swift 6 言语形式才会被宣告预备就绪。完结 Swift 6 言语形式的数据竞赛安全所需的剩下言语作业将分为两类:
- 添补严厉并发模型中的一切缝隙,以便静态地或在静态安全无法证明的状况下动态地诊断数据竞赛。
- 缓解已被证明是安全的形式对数据竞赛的虚假报告。
Swift 5.10 包括了许多与 actor 阻隔和 Sendable 查看有关的严重过错修复。此外,以下言语更改现在正在进行规划和施行,以承受 Swift 演进查看进程:
- SE-0411: 孤立的默认值表达式 23
- 为办法和键途径文字揣度 @Sendable 18
- 大局和静态变量的严厉并发查看 12
- 改进对闭包 actor 阻隔的控制 16
- 经过孤立值区域免除对非 @Sendable 值的约束 15
这些变化一起添补了严厉并发查看中的剩下首要缝隙,并经过引进更多的 @Sendable
揣度和启用安全的办法在阻隔鸿沟传递非 @Sendable
值,提高了严厉并发查看的可用性。言语辅导组承认,并发范畴的其他言语更改也很重要,但以上更改关于界说 Swift 6 言语形式是必要的。其他并发特性是附加的,能够独立探究。
Swift 6 搬迁
行将推出的功用 16 关于搬迁到 Swift 6 言语形式至关重要:能够逐个启用单个行将推出的功用,以逐步将代码库移向 Swift 6,然后再选用完好的言语形式。有许多从前承受的行将推出的功用将在 Swift 6 中默认启用:
- SE-0274: 简洁的魔术文件名 93 (
ConciseMagicFile
) - SE-0286: 用于跟随闭包的正向扫描匹配 55 (
ForwardTrailingClosures
) - SE-0337: 增量搬迁到并发查看 18 (
StrictConcurrency
) - SE-0354: 正则表达式文字 23 (
BareSlashRegexLiterals
) - SE-0383: 弃用
@UIApplicationMain
和@NSApplicationMain
70 (DeprecateApplicationMain
) - SE-0384: 导入前向声明的 Objective-C 接口和协议 31 (
ImportObjcForwardDeclarations
) - SE-0401: 由特点包装器引起的去除 Actor 阻隔揣度 22 (
DisableOutwardActorInference
) - SE-0409: 导入声明上的拜访级别修饰符 55 (
InternalImportsByDefault
)
言语辅导组已决议,从前承受的行将推出的功用 ExistentialAny 将不会在 Swift 6 中默认启用。SE-0335: 引进存在的任何 33 引进了 any 关键字以识别存在类型。该提案还规定,“裸” 协议名称将不再被答使用作类型——它们必须运用任何或一些,视状况而定——在行将推出的功用标志 ExistentialAny 下。鉴于关于向一致运用存在的任何言语搬迁的担忧,以及期望会呈现或许影响该搬迁最终成果的其他言语改进,言语辅导组正在将 SE-0335 中的源不兼容更改推迟到将来的言语修订中。
其他 Swift 6 或许包括源不兼容更改的演进提案,言语辅导组将在评价这类提案是否相关于源不兼容的本钱对言语的价值时逐个进行评价。例如,足够有价值的更改或许包括为完结首要功用(例如类型化抛出)而必需的轻微类型揣度更改,或许为了完成数据竞赛安全而进行的语义更改。
一旦为 Swift 6 预备好一切行将推出的功用,言语辅导组将供给一个搬迁攻略,主张以一种最佳途径逐步启用项目中的严厉并发查看,并供给有关怎么处理某些常见代码形式中的严厉并发违规的实践辅导。社区对这些攻略的反应关于评价 Swift 6 搬迁是至关重要的。
自中心团队宣告对 SE-0192(处理未来枚举事例,又称为非尽事枚举)施行修正以来已经过去了五年。
换句话说,专门用于非尽事枚举的要求,即增加 @unknown 默认状况,以处理未来的枚举事例,已从 “Swift 4 中的正告/Swift 5 中的过错” 降级为 “Swift 4 中的运转时圈套/Swift 5 中的正告”,以减轻源代码兼容性的影响。
直到今日,缺乏 @unknown default
状况依然是一个正告而不是过错;疏忽该正告意味着假如遇到未来的枚举事例,则会产生运转时圈套。
言语辅导组在考虑到 Swift 6 言语形式的计划时评论了 SE-0192 的当时状况,并且咱们宣告咱们将修正该提案以:
- 将 Swift 6 中的正告晋级为过错
- 为 Swift 5.x 增加一个行将推出的功用标志,以便用户能够逐步搬迁其代码。
正如咱们在关于 Swift 6 开展的最新帖子中宣告的那样,咱们已经运用行将推出的功用标志兼并了一些不兼容源代码的更改,计划在 Swift 6 中默认启用这些标志。当初查看 SE-0192 时,这种引进不兼容源代码更改的办法是不可用的,但今日咱们认为这是完结此功用的最合适,事实上是咱们仅有明智的挑选。咱们做出了这个决议,考虑到了几个要素,其间包括:
-
自 Swift 5 搬迁以来已经过去了很多年,并且该正告始终是无法消除的,除非实践编写
@unknown default
状况。 -
疏忽该正告意味着在遇到未来的枚举事例时留下了一个隐式的运转时圈套 – 在最坏的状况下,经过编写像
@unknown default: fatalError()
这样的内容,这种行为在Swift 6中依然能够轻松表达,但在明确处理时,用户能够挑选上下文中有意义且不需求中止履行的其他默认行为(例如,回来nil)。
这个有限的修订与启用非扩展枚举的正交、增量作业无关,该作业适用于非弹性库。
我心愿已久的一项功用是能够将类型的存储特点与计算特点分隔进行分类。现在,经过生成的文档很难整理出一切实例特点,以了解类型的实践表示是什么。
我今日对这个主意进行了一些查询,发现 lib/SymbolGraphGen
现在将一切实例特点都分类为存储特点(vp 2)。
从宣布的符号声明中也无法经过拜访器的存在({ get }
,{ get set }
等)来揣度这一点,因为这些也会呈现在存储的公共 private(set)
特点中。
lib/SymbolGraphGen
要宣布这些信息需求什么条件?
答复
有些相关的是,今日晚上我需求了解各种结构的实践布局 – 例如 UnsafeMutableBufferPointer
– 最终我不得不深化发掘 Swift stdlib 源代码中深藏的一些 gyb 模板(然后仔细阅读,以保证我找到了一切的存储特点,因为它们的声明实践上能够呈现在文件的任何当地)。
假如你不知道要专门去 GitHub 并详细查找苹果的 “Swift” 存储库,然后调整言语设置以使其实践显现这些模板文件,你永久找不到它们。查找引擎十分努力地不显现 GitHub 源代码的成果。
假如它们只是在文档中列出,即使只是在附录或脚注中,我会感到更快乐。
请注意,在这种状况下,次序也很重要。我需求知道完好的布局,以便将其映射到寄存器等等。
咱们有一个大型项目,从 TCA 的第一个版别开端,现在咱们正在运用版别 0.57.0
咱们计划搬迁到 TCA 的最新版别,但这需求一些时刻,而咱们需求运用 NavigationStackStore
,但由于咱们一切的 reducer 都是 AnyReducer 类型,我找不到一种完成的办法。
找到了在 AnyReducer 中运用 Reducer 协议的办法,但找不到一种办法在 Reducer 协议内部运用 AnyReducer 或混合它们
有什么主张吗?
答复
我认为你需求在 Reduce
中封装 AnyReducer
。相似这样:
static let reducer: AnyReducer<State, Action, Void> = .combine(
+ AnyReducer(
Reduce(
.init { state, action, _ in
return .none
},
environment: ()
)
.forEach(State.path, action: /Action.path) {
Path()
}
+ )
)
- 评论扩展条件列表才能
这只是一个小主意。假如有人乐意接手并拟定正式提案和施行,随时能够着手。
在运用了相对新但规模较小的 Verse 编程言语几个月后,我开端喜欢能够在 if 句子的条件列表中创建中心常量和变量,以及履行惯例函数的才能。
我开端考虑为什么 Swift 没有这样恰当方便的功用。与 Verse 不同,Swift 不将抛出过错视为条件。这是能够承受的,我并不打算改动这一点。
以下是我期望在 Swift 中被答应的示例。
之前:
if condition1 {
var someVariable = ...
// 运用 `condition1` 进行计算并改动 `someVariable`
callSideEffect(on: &someVariable)
callSideEffect()
if condition2 {
...
} else {
// 履行失利分支(模拟 A)
}
} else {
// A: 履行失利分支
}
之后:
if
condition1,
var someVariable = ..., // 新增(非条件)
callSideEffect(on: &someVariable), // 新增(非条件)
callSideEffect(), // 新增(非条件)
condition2
{
...
} else {
// A: 履行失利分支
}
为了简化问题,将惯例的 let 和 var 视为非条件。这有点相似于咱们如安在成果构建器中创建本地常量,这些常量不会立即被它耗费。
这个主意将扩展 if、guard 和 while 的条件列表。
答复
将条件列表重构为一个单独的函数使咱们能够简化代码为单一的 if/else 分支结构。
func shouldRun() -> Bool {
guard condition else { return false }
var someVariable = ...
callSideEffect(on: &someVariable)
callSideEffect()
return condition2
}
if shouldRun() {
...
} else {
// 履行失利分支
}
假设我想要将一个恣意的任务记录在一个变量中,以便稍后能够撤销它。这个变量的类型应该是什么?
var task: Task<Any, Never>
let foo = Task {
return "Hello World!"
}
let bar = Task {
return 42
}
task = foo // Cannot assign value of type 'Task<String, Never>' to type 'Task<Any, Never>'
答复
protocol Cancellable {
func cancel()
}
extension Task: Cancellable {}
var task: Cancellable!
let foo = Task {
"Hello World!"
}
let bar = Task {
42
}
task = foo
task.cancel()
引荐博文
摘要: 这篇博客评论了 Swift 5.9 版别中所包括的一些新的调试代码功用,一个能在实时查看溃散的外部互动性极强的溃散处理器,一个能够触发调试器进行即时调试的功用,以及一个能够提升了解在一个运用结构化并发的程序中的控制流程的并发意识撤退功用。
在 Swift 5.9 版别之前,一旦你的程序运转失利,你只能看到来自父进程(通常是 shell )的消息告知你子进程溃散了。而现在,你得到的信息将会更具有详细性。
作者还提出了一个名为”交互式撤退”的概念。在许多状况下,你或许会发现你在终端开发的程序溃散了,但你无法复现问题。没有恰当的溃散日志,这或许会让你十分懊丧,你知道你的程序有一个 bug ,但你不知道问题出在哪里,也不知道怎么复现它。这个特性的首要思想就是在程序溃散后将其挂起,然后给你机会附加一个调试器,或对溃散进程进行更深化的查看。
最后,撤退功用支撑结构化并发,并且能够正确地逆向穿过异步结构。不管你在哪个平台上,这个新功用都无需特殊要求,只需求回退追踪器能够查找到符号以确认给定结构是否是异步的。
把握 SwiftUI 中的 ContentUnavailableView
摘要: 这篇博客介绍了如安在 SwiftUI中 把握运用 ContentUnavailableView
类型。ContentUnavailableView
类型答应咱们在使用中体现空状况、过错状况或其他任何内容不可用的状况。
文章经过实例演示了 ContentUnavailableView
的基本用法以及如安在其间界说描绘文本和操作按钮。还介绍了 SwiftUI 为咱们供给的一种预制的 ContentUnavailableView
实例,可在查找屏幕中运用。总的来说,咱们学会了怎么使用 ContentUnavailableView
以用户友好的办法显现空状况。
摘要: 这篇博客介绍了 SwiftUI 在 WWDC2023 中引进的一种叫做 visualEffect
的新视图修饰符。 visualEffect 答应咱们经过拜访特定视图的布局信息来附加一组可动画的视觉作用。
经过上述示例,咱们能够看到界说了一个文本视图并附加了 visualEffect
视图修饰符。attach visualEffect
视图修饰符时,你需求指定闭包以使用所需的一切作用。
闭包供给了两个参数:第一个参数是附加到视图的作用集合的初始状况,是 EmptyVisualEffect
类型的实例;第二个参数是 GeometryProxy
类型的实例,包括或许需求的视图一切布局信息,比方结构、安全区等。现在,一切这些视觉作用都遵循 VisualEffect
协议,能够在 visualEffect
闭包中运用它们。
论题评论
假如公司在市中心,你会挑选那种办法?
- 计划一:租住公司附近,节省通勤时刻,房租压力大
- 计划二:租住离公司远,通勤时刻长,房租压力小
- 计划三:住自己的房子
欢迎在文末留言参与评论。
关于咱们
Swift社区是由 Swift 爱好者一起保护的公益组织,咱们在国内以微信公众号的运营为主,咱们会共享以 Swift实战、SwiftUl、Swift基础为中心的技能内容,也整理收集优异的学习资料。
特别感谢 Swift社区 修正部的每一位修正,感谢大家的辛苦支付,为 Swift社区 供给优质内容,为 Swift 言语的开展贡献自己的力气。