本期是 Swift 编辑组自主整理周报的第十一期,每个模块已初步成型。各位读者如果有好的提议,欢迎在文末留言。
欢迎投稿或推荐内容。目前计划每两周周一发布,欢迎志同道合的朋友一起加入周报整理。
在这个来去匆匆风云变幻的季节,Swift社区更像一个密不透风的茧,为的只是有朝一日能够破茧成蝶。
周报精选
新闻和社区:部分 iPhone 14 Pro / Max 被爆开机闪现水平线
提案:
DiscardingTaskGroups
提案正在审查Swift 论坛:讨论修改 SE-0368 以删除前缀
+
运算符推荐博文:SwiftUI 的优势、劣势和缺陷
话题讨论:
疫情放开,你处于什么阶段
一些 iPhone 14 Pro 和 iPhone 14 Pro Max 用户报告说,当设备被打开时,iPhone 显示屏上闪烁着水平线,但没有明确的原因或如何修复它。
在 Reddit 的主题帖子中,数十名 iPhone 14 Pro 用户报告说,当设备被打开时,一条或多条绿色和黄色的线条可能会在屏幕上闪烁,几秒钟后消失。根据这些用户的说法,苹果支持部门已经通知他们,该问题不是硬件缺陷造成的,而是 iOS 16 的错误 Bug。
苹果已取消 iOS 16.2 升级到新 Home 家庭架构的选项,iOS 16.2 和 macOS Ventura 13.1 的主要新功能之一是能够升级到新的 Home 家庭应用架构。虽然苹果没有分享具体的变化细节,但表示,该升级为 HomeKit 配件提供了“更好的性能和可靠性”。
Apple Watch 无创测血压功能即将到来,苹果正积极积累相关技术。IT 之家 12 月 23 日消息,知情人士在今年 4 月透露,苹果计划在 Apple Watch 中添加血压监测功能,但由于遇到障碍,该项技术预计最早要到 2024 年才能推出。苹果目前也在积极地积累技术支持,美国商标和专利局(USPTO)公示了一项新的苹果专利(专利号 US 20220400959),涉及获取和分析无创血压测量数据的系统和方法。
苹果 iPhone 15 系列将采用高通骁龙 X70 5G 基带芯,根据 DigiTimes 报道,苹果 iPhone 15 系列将继续采用高通 5G 调制解调器(基带芯片),因为苹果公司仍在继续开发自有的 5G 定制芯片。
SE-0381 DiscardingTaskGroups 提案正在审查。
该提案建议为 TaskGroup
和 ThrowingTaskGroup
引入一个新的布尔参数 discardResults
。此参数将控制 TaskGroup
是保留其已完成子任务的结果,然后确定是传递给 next()
,还是立即丢弃。
SE-0382 Expression Macros 提案正在审查。
Expression Macros
提供了一种用新型表达式扩展 Swift 的方法,这些表达式可以对其参数执行任意语法转换以生成新代码。 Expression Macros
使得用以前只有引入新的语言特性才能实现的方式扩展 Swift 成为可能,帮助开发人员构建更具表现力的库并消除无关的样板。
Swift to C++ 将 Swift 参数标签合并到生成的 C++ 函数名中
讨论如何测试发送动作的长时间运行效果?
议案 [Pitch] 结果构建器范围内的不合格查找
介绍:
结果构建器为定义声明式 DSL 提供了基础——特定领域的语言提供了在特定领域工作的定制语法,例如生成图表或文本处理。 利用结果构建器的复杂 DSL API 遇到了设计可扩展性和类型检查性能方面的问题,引入了需要解决的关键挑战。
扩展结果构建器以支持在其主体内进行范围内的非限定名称查找,即特定于构建器类型的范围内名称间距,将启用新的 API 模式,显着降低类型检查的复杂性,同时改善调用站点的美感。
内容:SE-0368包括对 StaticBigInt
的以下操作:
/// Returns the given value unchanged.
public static prefix func + (_ rhs: Self) -> Self
这被包括在内,以便前缀 + 可以作为文字前缀包含在上下文中,在这些上下文中,值需要是 StaticBigInt
类型,而不是另一种类型的文字,以便与 - 对称:
let signs: [StaticBigInt] = [-1, 0, +1]
事实证明,这是一个源代码的突破性变化,因为有如下示例:
let a: Int = 7
let b = +1 // Inferred as `StaticBigInt` because concrete `+` beats
// the generic one on `AdditiveArithmetic`
let c = a + b // Error: Cannot convert `b` from `StaticBigInt` to `Int`
之前,b
被赋予了 Int
类型,这个例子编译正确。建议修改 SE-0368
以删除此运算符。 这对于想要使用 StaticBigInt
值的代码来说是一个小小的不便,但是不存在这样的代码,因为 5.7 中不存在该类型。
这样的代码可以省略前导 + 作为解决方法。
一旦解决了源中断问题,我们就可以调查其他选项以在空闲时恢复所需的语法。
讨论 ArgumentParser 包出现 no such file 错误
讨论如何打印 HTTPS URL 参数和正文
提议
内容:
在 SE-0235
中将结果类型引入标准语言是我在构建库时最喜欢的功能之一。 当返回的 Result 用户想要评估时,通常看起来有点像这样:
let result: Result = getResult()
switch result {
case .success(let data):
// Do something with the data here
case .failure(let error):
// Handle error
}
这对大多数情况都很好。 然而,如果我们需要级联多个结果,它会变得有点难看。
例如:
let firstResult: Result = getFirstResult()
switch firstResult {
case .success(let data):
let secondResult: Result = getSecondResult(using: data)
switch secondResult {
case .success(let secondData):
// Do something with secondData
case .failure(let secondError):
// Handle secondError
}
case .failure(let firstError):
// Handle firstError
}
如上所述,嵌套切换变得有点沉重。 这常常让我想起嵌套的 if 语句,作为一个“从不嵌套”的人,我通常会在这里求助于 guard
关键字。 我认为 guard 关键字对于评估 Result 类型也非常有用,但是因为它现在有效,但 gaurd 关键字对于 Result type 用起来有问题。
let firstResult: Result = getFirstResult()
guard case .success(let data) = firstResult else {
// Handle first error - But no reference to firstError!
return
}
let secondResult: Result = getSecondResult(using: data)
guard case .success(let secondData) = secondResult else {
// Handle second error - But no reference to secondError!
return
}
正如评论所暗示的那样,我没有引用 guard
语句的 else
部分中的错误类型。 据我所知,没有办法使用这种语法并访问返回的错误类型。
也许有一些方法可以通过扩展 guard
语句或更新 Result
类型来实现此功能?
所以这就是为什么我要提出这个建议。我不是确定能百分百修复。甚至不确定这是对语言的有用更改还是其他 Swift 用户想要的东西。让我们在这里讨论一下!
疫情放开,你处于什么阶段
欢迎在文末留言参与讨论。
Swift社区是由 Swift 爱好者共同维护的公益组织,我们会分享以 Swift实战、SwiftUl、Swift基础为核心的技术内容,也整理收集优秀的学习资料。
特别感谢 Swift社区 编辑部的每一位编辑,感谢大家的辛苦付出,为 Swift社区 提供优质内容,为 Swift 语言的发展贡献自己的力量。