前言
本期是 Swift 编辑组自主整理周报的第二期,每个模块还在调整磨合期。各位读者如果有好的提议,欢迎在文末留言。
Swift 周报在 GitHub 开源,欢迎提交 issue,投稿或推荐内容。目前计划每两周周一发布,欢迎志同道合的朋友一起加入周报整理。
平凡的八月,不平凡的世界,你若落后,必定挨打,你若前进,方得始终!Swift社区,给你最新的指引,给你最真的铠甲!
周报精选
新闻和社区:已消失 5 年 iPhone 电量百分比为何现在回归
提案:和脚本语言相媲美的字符串算法
Swift 论坛:你是否希望支持在 Windows 上构建 Swift
推荐博文:Swift社区 成立文章仓库
新闻和社区
已消失 5 年 iPhone 电量百分比为何现在回归?
2017年,iPhone X 以后,电量百分比一直隐藏在下拉通知栏,而现在,在最新测试版的 iOS 16系统中,电量百分比以数字形式被写入电池图标内。
如果苹果在下一代 iPhone 上增加一个常亮显示功能,那么这种电池百分比调整也会很有用,因为用户可以在不碰手机的情况下就可查看电池状态。还有传言称,iPhone14 系列将会在 Pro 机型上采用挖孔屏,顶部更大的显示面积或许也是苹果复活百分比显示的原因之一。
苹果发言人没有立即透露这个电池百分比调整是否会延续到 iOS 16 的最终版本。这次更新目前只出现在开发者版和公测版。新iOS系统将于今年秋天发布,可能是在 9 月份,届时苹果预计将发布iPhone 14。@凤凰网科技
线上讲座:App 内购买的新功能
诚挚邀请您参加我们于 2022 年 8 月 18 日(周四)在线举办的“线上讲座:App 内购买的新功能”。
建议参会对象:开发人员。
注册成功并收到活动确认函后方可参会。名额有限,报满即止。
设计开发加速器活动注册指南:
https://essentials.applesurveys.com/WRQualtricsControlPanel_rel/File.php?F=F_a4rFfRXziNGhoAm
请持续关注 Apple 开发者官网:https://developer.apple.com/cn/accelerator/
我们会不定期地发布下期活动信息,届时可自行申请,获得批准后即可参加活动。
了解如何使您的 App 内购买体验更加完美, 并探索 StoreKit 2 和 App Store Server API 的增强功能和 App Store Server 通知的改进。了解如何利用 App Transaction API 验证 App 的购买,为 StoreKit 模型添加属性,并在交易中保留 App 的 applicationUsername。如果您是服务器端开发人员,我们将向您展示如何充分利用 App Store 服务器通知、检索用户交易历史的其他方法,以及当您的服务器出现故障时如何进行恢复。了解如何迁移到最新的 App Store Server API 并整合 App Store 服务器通知。
在线活动议程:
10:00-10:30 StoreKit 2 的新功能
10:30-11:00 App Store 服务器 API 和服务器通知新功能
Apple Entrepreneur Camp 已开放申请,欢迎女性、黑人和西班牙裔/拉丁裔创业者参加
pple Entrepreneur Camp 旨在为 App 驱动型组织中的少数群体创业者及开发者提供支持,助力其研发新一代的前沿 App 并开拓全球网络,鼓励这些创业者在技术领域不断探索并取得持续发展。
三组面向女性、黑人以及西班牙裔及拉丁裔创业者的在线课程将在 2022 年 10 月开展,欢迎选择合适的一组提交申请。课程期间,Apple 工程师将为学员提供编程指导,Apple 高层也将作为导师分享见解、启发灵感。申请截止日期为 2022 年 8 月 24 日。
提案
通过的提案
SE-0365 在 self
被解包后,允许为weak self
捕获隐式self
提案已通过。
从 SE-0269 开始,当 self
在捕获列表中显式写入时,允许在闭包中使用隐式 self。 应该将这种方式支持扩展到 weak self
捕获,并且只要 self
已解包,就允许隐式 self 。
class ViewController {
let button: Button
func setup() {
button.tapHandler = { [weak self] in
guard let self else { return }
dismiss()
}
}
func dismiss() { ... }
}
SE-0362 即将到来的语言改进的逐渐采用 提案已通过。该提案已在上期周报正在审查的提案模块做了详细介绍。
SE-0357 基于正则表达式的字符串算法 提案已通过。
与其他比较常用的编程语言或者脚本语言相比,Swift 标准库处理字符串算法的功能明显不足。其中一些功能可以在 NSString
中找到,但是这些基础的功能应该在 Swift 标准库中完善。
本提案中的建议如下:
- 新增加到标准库的正则表达式字符串算法,功能性和实用性要和脚本语言相媲美
- 就子序列而言,这些算法与通用
Collection
相同 CustomConsumingRegexComponent
协议允许第三方库提供industrial-strength
作为正则表达式的可混合组件
正在审查的提案
SE-0368 StaticBigInt 正在审查
Swift 源代码中的整数文字可以表示任意大的值。但是符合 ExpressibleByIntegerLiteral
协议的标准库之外的类型,在实际使用过程中受限于使用多大的文字值来构建。
因为传递给 init(integerLiteral:)
的值必须是标准库支持的类型,因此很难在标准库之外编写新的整数类型。
SE-0367 优化新属性的条件编译 正在审查
随着时间的推移,Swift 引入了一些新的属性来优化性能,提供更多的表达能力和编译检查等功能。但是在现有的源码中增加新属性意味着旧的编译器无法进行编译。
可以使用条件编译来解决这个问题,但是实现代码冗长很不方便。例如,使用 #if 检查编译器版本确定是否可以使用 @preconcurrency
属性,代码如下:
#if compiler(>=5.6)
@preconcurrency protocol P: Sendable {
func f()
func g()
}
#else
protocol P: Sendable {
func f()
func g()
}
#endif
通过上面的代码可以看到,这样实现会有很多重复的代码。另外 Swift 5.6
编译器是第一个包含 @preconcurrency
属性的编译器,但是有可能这个属性在 5.6 以前就被启用,或者在 Swift 5.6
的开发过程中启用,通过判断版本号就会有误差。建议采用下面的代码方式来规避这些问题。代码如下:
#if hasAttribute(preconcurrency)
@preconcurrency
#endif
protocol P: Sendable {
func f()
func g()
}
SE-0366 代码上下文新增敏感关键字 move 正在审查
在代码中使用 move
关键字,可以结束 let
、var
或者 consuming
函数参数的生命周期。并通过编译器实时做出判断强制执行此操作。示例代码如下:
useX(x) // do some stuff with local variable x
// Ends lifetime of x, y's lifetime begins.
let y = move x // [1]
useY(y) // do some stuff with local variable y
useX(x) // error, x's lifetime was ended at [1]
// Ends lifetime of y, destroying the current value.
move y // [2]
useX(x) // error, x's lifetime was ended at [1]
useY(y) // error, y's lifetime was ended at [2]
Swift论坛
是否有 SPM
命令来显示依赖项是如何产生的?可以显示指定 Swift 包在构建中生成的所有依赖路径。
有一个网络请求,源码如下:
func downloadRequested(_ request: DownloadRequest) async throws -> Response {
let download = try await self.download(for: request)
self.transferIdMap[download.transferId] = download.itemId
let size = try Int64(download.dataProvider.size())
return (download.transferId, size, download.originalFilename, download.dataProvider.mimeType)
}
对这个网络请求的速率进行限制。当有很多的请求未完成时,希望延迟此方法的执行,并将异步回调返回给方法调用者。维持 async/await
流程。
在 Apple 平台上,使用 swift Package 中的动态库非常容易。只需要创建一个 .xcframework
其中包含 .dylib
文件和头文件,并使用 binaryTarget
将其添加到 Package 中。在 Linux 上,没有这么简单的解决方案。
目前有许多工具类领域处于无人管理的状态。应该需要有一个小组来监督、推动和指导工作。这些领域包含:SwiftPM、SourceKit-LSP、VSCode 扩展、LSP、Swift Format、API Breaking Change checker、Swiftly、Docker 镜像、DocC、SwiftMarkdown 等等。
List(workoutTypes) { workoutType in
NavigationLink(
workoutType.name,
destination: SessionPagingView(),
tag: workoutType,
selection: $workoutManager.selectedWorkout
)
}
在 iOS 16中 init(_:destination:tag:selection:)
方法被弃用。Apple 建议在 NavigationStack
或者
NavigationSplitView
的列表中使用 NavigationLink(_:value:)
。
推荐博文
摘要: 给大家推荐一下 Swift社区 的文章仓库,里面整理了公众号中的文章,并进行分类(Swift 进阶、Swift 基础、SwiftUI 进阶、SwiftUI 基础、Tips、iOS、面试)。方便大家查找阅读。以后会同步更新维护。
摘要: 业界首发,很多开发者会被这个问题困扰。如果你的 Flutter 版本号小于等于 2.5.3
或大于等于 3.0.5
,以下描述的问题将不会发生在你的应用中,但是我相信大部分应用都会命中此区间。
swift-5.5.1-RELEASE源码编译(Xcode)
摘要: 使用 ninja 构建 swift-5.2.4-RELEASE
版本,然后通过 vscode 和 lldb
插件来调试 swift 源码。
摘要: 经常会收到司机反馈手机发烫,耗电,crash等等问题。线程治理专项应运而生,目的就是降低crash,手机发烫,耗电等问题,尽量给原本并不富裕的内存,雪中送炭。
摘要: 在 Xcode 14 的公告中说明,允许在 Xcode 项目中使用 Swift Package 插件,以及一些架构更改。例如本文的Swift Package 插件生成代码。
关于我们
Swift社区是由 Swift 爱好者共同维护的公益组织,我们会分享以 Swift实战、SwiftUl、Swift基础为核心的技术内容,也整理收集优秀的学习资料。
特别感谢 Swift社区 编辑部的每一位编辑,感谢大家的辛苦付出,为 Swift社区 提供优质内容,为 Swift 语言的发展贡献自己的力量。