0
点赞
收藏
分享

微信扫一扫

Swift 周报 第二十期

前言

本期是 Swift 编辑组自主整理周报的第十一期,每个模块已初步成型。各位读者如果有好的提议,欢迎在文末留言。

欢迎投稿或推荐内容。目前计划每两周周一发布,欢迎志同道合的朋友一起加入周报整理。

在这个来去匆匆风云变幻的季节,Swift社区更像一个密不透风的茧,为的只是有朝一日能够破茧成蝶。👊👊新闻和社区

部分 iPhone 14 Pro / Max 被爆开机闪现水平线

一些 iPhone 14 Pro 和 iPhone 14 Pro Max 用户报告说,当设备被打开时,iPhone 显示屏上闪烁着水平线,但没有明确的原因或如何修复它。

在 Reddit 的主题帖子中,数十名 iPhone 14 Pro 用户报告说,当设备被打开时,一条或多条绿色和黄色的线条可能会在屏幕上闪烁,几秒钟后消失。根据这些用户的说法,苹果支持部门已经通知他们,该问题不是硬件缺陷造成的,而是 iOS 16 的错误 Bug。

Swift 周报 第二十期_iOS

iOS 16.2 不能升级 Home 应用架构

苹果已取消 iOS 16.2 升级到新 Home 家庭架构的选项,iOS 16.2 和 macOS Ventura 13.1 的主要新功能之一是能够升级到新的 Home 家庭应用架构。虽然苹果没有分享具体的变化细节,但表示,该升级为 HomeKit 配件提供了“更好的性能和可靠性”。

Swift 周报 第二十期_Data_02

AppleWatch 或可无创测血压

Apple Watch 无创测血压功能即将到来,苹果正积极积累相关技术。IT 之家 12 月 23 日消息,知情人士在今年 4 月透露,苹果计划在 Apple Watch 中添加血压监测功能,但由于遇到障碍,该项技术预计最早要到 2024 年才能推出。苹果目前也在积极地积累技术支持,美国商标和专利局(USPTO)公示了一项新的苹果专利(专利号 US 20220400959),涉及获取和分析无创血压测量数据的系统和方法。

Swift 周报 第二十期_iOS_03

iPhone15 系列将继续采用高通5G基带芯片

苹果 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论坛

  1. Swift to C++ 将 Swift 参数标签合并到生成的 C++ 函数名中
  2. 讨论如何测试发送动作的长时间运行效果?
  3. 议案 [Pitch] 结果构建器范围内的不合格查找

介绍:

结果构建器为定义声明式 DSL 提供了基础——特定领域的语言提供了在特定领域工作的定制语法,例如生成图表或文本处理。 利用结果构建器的复杂 DSL API 遇到了设计可扩展性和类型检查性能方面的问题,引入了需要解决的关键挑战。

扩展结果构建器以支持在其主体内进行范围内的非限定名称查找,即特定于构建器类型的范围内名称间距,将启用新的 API 模式,显着降低类型检查的复杂性,同时改善调用站点的美感。

  1. 议案​​修改 SE-0368 以删除前缀 + 运算符​​

内容:​​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 中不存在该类型。

这样的代码可以省略前导 + 作为解决方法。

一旦解决了源中断问题,我们就可以调查其他选项以在空闲时恢复所需的语法。

  1. 讨论 ArgumentParser 包出现 no such file 错误
  2. 讨论如何打印 HTTPS URL 参数和正文
  3. 提议 <Success, Failure> Guard Evaluation 会更好

内容:

在 ​​SE-0235​​ 中将结果类型引入标准语言是我在构建库时最喜欢的功能之一。 当返回的 Result 用户想要评估时,通常看起来有点像这样:

let result:  Result<Data, MyCustomError> = getResult()

switch result {
case .success(let data):
// Do something with the data here
case .failure(let error):
// Handle error
}

这对大多数情况都很好。 然而,如果我们需要级联多个结果,它会变得有点难看。

例如:

let firstResult:  Result<Data, MyCustomError> = getFirstResult()

switch firstResult {
case .success(let data):
let secondResult: Result<Data, MyCustomError> = 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<Data, MyCustomError> = getFirstResult()
guard case .success(let data) = firstResult else {
// Handle first error - But no reference to firstError!
return
}

let secondResult: Result<Data, MyCustomError> = getSecondResult(using: data)
guard case .success(let secondData) = secondResult else {
// Handle second error - But no reference to secondError!
return
}

正如评论所暗示的那样,我没有引用 ​​guard​​​ 语句的 ​​else​​ 部分中的错误类型。 据我所知,没有办法使用这种语法并访问返回的错误类型。

也许有一些方法可以通过扩展 ​​guard​​​ 语句或更新 ​​Result​​ 类型来实现此功能?

所以这就是为什么我要提出这个建议。我不是确定能百分百修复。甚至不确定这是对语言的有用更改还是其他 Swift 用户想要的东西。让我们在这里讨论一下!

  1. 讨论 ​​Swift 是否允许重载属性​​


举报

相关推荐

0 条评论