Swift 周报 第三十三期
文章目录
- 前言
- 新闻和社区
- App 内购买项目和订阅即将实行价格与税率调整
- 为家庭提供安全的 App 体验
- 提案
- 正在审查的提案
- Swift论坛
- 推荐博文
- 话题讨论
- 关于我们
前言
本期是 Swift 编辑组自主整理周报的第二十四期,每个模块已初步成型。各位读者如果有好的提议,欢迎在文末留言。
Swift 周报在 GitHub 开源,欢迎提交 issue,投稿或推荐内容。目前计划每两周周一发布,欢迎志同道合的朋友一起加入周报整理。
看那碧水蓝天,波澜又壮阔。浅读Swift社区,充实而豁然。期许光亮,皆在其中!
周报精选
新闻和社区:App 内购买项目和订阅即将实行价格与税率调整
提案:将 conformance 宏作为 extension 宏
Swift 论坛:讨论
\
和$
的意义推荐博文:轻量化的 iOS 动画框架实现
话题讨论:
最新薪酬排行出炉,广州平均月薪 10883 元,北京平均月薪 13438 元,你的月薪处于什么水平?
新闻和社区
App 内购买项目和订阅即将实行价格与税率调整
App Store 的交易和支付机制旨在帮助你在覆盖全球的 175 个国家和地区的店面中,以 44 种货币为你的产品和服务便捷地进行定价与销售。当税务法规或外汇汇率变化时,App Store 中某些地区的价格有时会随之更新,且你的收入亦将调整。这些调整将根据金融数据机构提供的公开汇率信息进行,以此确保 App 和 App 内购买项目的定价在所有店面中保持平衡。
从 7 月 25 日起,App 和 App 购买项目 (不包括自动续期订阅) 在埃及、尼日利亚、坦桑尼亚和土耳其店面中的定价将会进行调整。这些调整还包含了以下税率变更:
埃及:收取 14% 的增值税 (VAT)
坦桑尼亚:收取 18% 的增值税和 2% 的数字服务税
土耳其:增值税率从 18% 上调至 20%
这些调整对定价的影响
如果你选择了埃及、尼日利亚、坦桑尼亚或土耳其作为 App 或 App 内购买项目 (不包括自动续期订阅) 的基准店面,则对应店面中的价格不会发生变化。其他店面中的价格将会进行更新,以便与你选择的基准价格保持持平。
如果你为 App 或 App 内购买项目 (不包括自动续期订阅) 选择的基准店面不是埃及、尼日利亚、坦桑尼亚或土耳其,则埃及、尼日利亚、坦桑尼亚和土耳其店面中的价格将会上调。
如果你的 App 内购买项目是自动续期订阅,或者如果你手动管理各个店面的价格,而不是使用自动均衡价格,那么你的价格不会发生变化。
App Store Connect 中“我的 App”的“价格与销售范围”部分现已更新,以显示这些即将进行的价格调整。一如既往,你可以随时更改你的 App、App 内购买项目和自动续期订阅的价格。
这些调整对收益和税务管理的影响
你从 App 和 App 内购买项目 (包括自动续期订阅) 销售中获得的收益将会发生变化,以反映新的税率和更新后的价格。《付费 App 协议》的附录 B 已更新,表明 Apple 在埃及和坦桑尼亚征收和汇付适用税款。
为家庭提供安全的 App 体验
App Store 的创建目的是为用户提供一个安全且值得信赖的 App 下载平台,并为开发者提供绝佳的商机。由于孩子们会使用我们的产品和服务,来探索数字世界并与家人和朋友进行交流,因此对许多家庭而言,Apple 平台和你构建的 App 变得非常重要。针对面向儿童的 App,以及那些具有用户生成内容和互动的 App,我们设立了极高的标准。为了继续为家庭打造安全的体验,谨在此提醒你,我们提供了各种工具和资源,并制定了相关要求,以帮助你保障用户在 App 中的安全。
提案
正在审查的提案
SE-0398 将 conformance 宏作为 extension 宏 提案正在审查。
该提案将 conformance
宏角色推广为 extension
宏角色,除了协议和 where 子句外,还可以向扩展中添加成员列表。
Swift论坛
- 讨论这些是错别字吗?
提问:
在观看 SwifUIi 视频时,看到两处看起来像是拼写错误的东西。想知道为什么它们的表达如此含糊:
反斜杠有什么用?
var body: some View {List (graphics, children: \.children) { graphic inGraphicRow (graphic)}.listStyle(SidebarListStyle())
}
美元符号有什么用?
var body: some View {DocumentGroup (newDocument: SketchDocument()) { file inDocumentView(file.$document)}
}
回答:
这些不是拼写错误。它们是用于访问特定语言功能的符号,这些功能会生成与命名属性相关的内容,而不是正常访问该属性。
Swift 在前缀运算符位置中使用 \ 来创建“关键路径”,该对象通常表示(在本例中)Graphic.children
属性,而不是特定 Graphic
的 Children
属性;该对象可以应用于 Graphic 的任何实例以访问其 Children 属性。
在其他语言中,\ 字符在字符串文字中很常见,它开始一个“转义序列”,但它很少用作运算符,并且使用它的语言之间几乎没有一致性。
这里与“转义”的想法有某种模糊的联系,因为在这两种情况下,你都在逐步提升到更抽象的含义水平,但在大多数情况下,它被选择是因为它是一个未使用的符号,通常是 易于打字并且看起来不错。 该功能的演变提案实际上讨论了几种不同的语法,并解释了为什么选择反斜杠。
$ 前缀意味着您正在访问相关属性的属性包装器提供的特殊功能。在这里,该属性是 FileDocumentConfiguration.document
,根据文档有一个 @Binding
属性包装器。 这意味着 $document 将公开一个到文档的 Binding - 一个可用于访问和修改该文档属性的对象,而无需关心它实际存储的位置。
我们将此 $ 变量称为“投影值”而不是“绑定值”或其他任何名称,因为 $ 语法是通用语言功能,因此如果您使用 @Binding 以外的其他内容,$ 属性可能不会创建绑定;可能被赋予一些其他功能。
选择这两种语法并不是因为它们会立即熟悉,而是因为我们确定没有一种语法可以立即熟悉,最好选择开发人员需要学习但一旦学习后会发现易于使用的语法。
- 讨论NSLock.Lock 加 Await 加 NSLock.Unlock 导致主线程冻结
提问:
以下代码模拟了当外部库的作者引入锁时的情况,这可能包含等待调用。
有什么办法可以防止这种情况
noasync 注释不是解决方案,因为:
1)如果函数包装在另一个没有 noasync 注释的函数中,它不起作用;
2)第三方库的作者可能会忘记添加这样的注释。
let lock = NSLock()func thirdPartyLibLock() {print("- do sum work and lock")lock.lock()/*I also tried to replace it with:await withCheckedContinuation({ c inlock.lock()c.resume()})*/
}func thirdPartyLibUnlock() {print("- do sum work and unlock")lock.unlock()/*I also tried to replace it with:await withCheckedContinuation({ c inlock.unlock()c.resume()})*/
}func example() {/*Console:- start 4- do sum work and lock- start 1- do sum work and lockAnd that's all. We have suspended main thread.Numbers 4 and 1 could differ between app launches, it's ok.*/for i in 0...1000 {Task {print("- start \(i)")thirdPartyLibLock()try await Task.sleep(for: .seconds(1))thirdPartyLibUnlock()print("- end \(i)")}}// Won't be executed.DispatchQueue.main.asyncAfter(deadline: .now() + 3, execute: {print("- ping")})
}
回答:
由于多种原因,锁定+解锁 API 对在设计上是不安全的,这就是其中之一。 更好的设计是使用一个函数来获取锁,调用回调,然后在回调返回后释放锁。
(理想情况下,该函数还可以提供对受锁保护的资源的回调访问,否则将无法访问。)只需使整个过程同步,就可以非常巧妙地表达在锁定和解锁之间不挂起的要求。
- 讨论所需的 Swift 语言功能可以提升 C++ 互操作性支持的状态
内容:
Swift 5.9 可以在 Swift 中导入和使用多种 C++ 类型。 但是,并非所有类型类别都受支持。这篇文章列出了一组所需的 Swift 语言功能,这些功能使我们能够支持 Swift 中的大多数 C++ 类型:
对不可复制类型的泛型支持。 虽然 Swift 5.9 添加了对不可复制结构和枚举的支持,但这些类型仍然不允许用作泛型类型参数。
这是阻止我们在 Swift 中完全完成对仅移动 C++ 类型的支持的一个关键问题,因为我们需要形成像 UnsafePointer 这样没有语言限制的类型。
添加到上面的一点,像 UnsafePointer 和 UnsafeMutablePointer 这样的类型应该提供对借用和可变借用不可复制指针对象的支持。
不可移动/不可逃避的 Swift 类型类别。 不可转义和不可复制的 Swift 类型将允许我们在 Swift 中导入和建模不可复制和不可移动的 C++ 类型。
此外,以下语言功能将有助于改善 Swift 中对 C++ 类型执行的一些常见操作的人体工程学:
能够在 Swift 序列上执行借用 for 循环,这确实需要经过 IteratorProtocol,但可以使用索引迭代。 这将使我们能够自动在 std::map 等非随机访问集合上使用 for 循环。
回答:
这些听起来与我们计划完善不可复制类型支持的项目一致,这很好。 在此列表中包含内部导入以及支持导入 C 和 C++ 类型而不间接公开其 ABI 是否也有意义,以便允许包在内部使用 C++ 互操作而不要求依赖项了解它?
- 讨论将协议添加到同名模块
提问:
我有一个名为 HTML 的模块,其中包含同名的类型 HTML。 它的树看起来像这样:
- HTML(模块)
- HTML(结构)
- HTML.属性(枚举)
- HTML.ContainerElement(枚举)
- HTML.VoidElement(枚举)
到目前为止,一切都很好。 不可能限定对该模块中的声明的引用,因为它是同名的,但这没关系,因为 HTML 类型本身在功能上是命名空间限定符。
现在想向这个模块添加一个协议,称之为 HTMLOutputStreamable
。但是不能向未命名为 HTML 的 HTML 模块添加顶级类型,因为该模块是同名的,并且无法使用 HTML.HTMLOutputStreamable
来限定对此协议的引用。
该如何解决这个问题?
回答:
我发现的唯一方法就是使用不同的名称。
从这个角度来看,Swift 仍然缺少完整的命名空间功能。 可以是模块级命名空间,但更完整和可靠。 我更喜欢像 C++ 那样的命名空间,或者像 Rust 那样的显式模块定义,但这似乎不是 Swift 进化愿景的一部分。
- 讨论嵌套函数和 @ViewBuilder:奇怪的编译器错误
以下代码给出了一个奇怪的编译器错误,该错误似乎不相关:
struct ContentView: View {var body: some View {func world() -> String {"world"}Text("Hello, \(world())!")}
}
错误信息是:
包含声明的闭包不能与结果生成器 “ViewBuilder” 一起使用
有趣的是,如果我在 world() 中添加 return (即 return “world”),编译器会在其他地方显示错误并添加警告,两者也不是很相关。 这看起来更像是一个编译器错误。
有什么想法吗?
回答:
从历史上看,结果构建器对其内部运行的语法有一些限制。 其中许多限制在 SE-0373:解除结果构建器中变量的所有限制中被删除,但如果仍然存在一些限制,我不会感到惊讶。
推荐博文
轻量化的 iOS 动画框架实现
摘要: 在这篇博客中,介绍了日常开发中对视图进行动画处理的常见问题,并提供了一种解决方案。文章首先展示了普通的动画代码,并指出了其回调函数回溯的问题。接着介绍了一些流行的动画库,如 Spring , Hero 和 TweenKit ,但它们都存在一些限制。为了解决这些问题,引入了一种简洁、易于使用和维护的动画执行方式。该方案基于 Animator 和 Animation 的封装实现,其中 Animator 定义了动画执行器的基本协议,并封装了几种不同类型的动画执行器。 Animation 定义了动画执行的参数,并为不同的 Animato r制定了不同的协议。此外,文章还介绍了类型擦除的概念,以解决参数类型不一致的问题。具体实现方面,通过扩展UIView添加了串行和并行动画的方法。最后,总结了该方案的优点和可能的改进点。
使用 Swift Package 插件将自定义字体加载到您的应用程序中
摘要: 本文介绍了如何使用 Swift Package 插件将自定义字体加载到应用程序中。通过创建一个 Swift Package 来包含共享的字体文件和字体加载代码,可以加快新应用的发布速度,减少代码重复,并提供一个统一更新字体文件的地方。结合 Swift Package 的可重用性和 Swift Package 插件的强大功能,甚至可以在构建时从字体文件自动生成所有必要的代码。本文使用 SwiftGen 来演示如何实现这一点。首先创建一个名为 “Fonts” 的 Swift Package ,并在其中添加自定义字体资源。然后添加 SwiftGen 插件来生成加载字体所需的代码。最后,可以使用生成的代码来在 SwiftUI 和 UIKit 中使用自定义字体。
掌握 Swift Foundation Formatter API 。自定义格式样式
摘要: 本篇博客介绍了如何使用 Swift Foundation Formatter API 中的自定义格式样式。作者分享了自己在每个项目中都使用该 API 并构建自定义格式化逻辑的经验。博客中详细讲解了 FormatStyle 协议以及如何创建符合该协议的自定义格式样式。通过示例,展示了如何创建短数字格式样式和粗体数字格式样式,并说明了如何在自定义类型中重用这些格式样式。最后,作者还提供了一种封装格式化逻辑的方法。
话题讨论
最新薪酬排行出炉,广州平均月薪 10883 元,北京平均月薪 13438 元,你的月薪处于什么水平?
- 巨富
- 豪
- 小富
- 小康
- 穷
欢迎在文末留言参与讨论。
关于我们
Swift社区是由 Swift 爱好者共同维护的公益组织,我们在国内以微信公众号的运营为主,我们会分享以 Swift实战、SwiftUl、Swift基础为核心的技术内容,也整理收集优秀的学习资料。
特别感谢 Swift社区 编辑部的每一位编辑,感谢大家的辛苦付出,为 Swift社区 提供优质内容,为 Swift 语言的发展贡献自己的力量。
相关文章:

Swift 周报 第三十三期
文章目录 前言新闻和社区App 内购买项目和订阅即将实行价格与税率调整为家庭提供安全的 App 体验 提案正在审查的提案 Swift论坛推荐博文话题讨论关于我们 前言 本期是 Swift 编辑组自主整理周报的第二十四期,每个模块已初步成型。各位读者如果有好的提议ÿ…...

网络空间安全及计算机领域常见英语单词及短语——网络安全(一)
目录 网络空间安全常见英语单词没事儿读着玩儿相关知识扫盲 CSDN的小伙伴们,我快回来咯!网络空间安全常见英语单词 Cybersecurity 网络安全Network security 网络安全Information security 信息安全Data protection 数据保护Threat analysis 威胁分析Ri…...

Go基准测试Benchmark
Go语言自带了一个强大的测试框架,其中包括基准测试(Benchmark)功能,基准测试用于测量和评估一段代码的性能。 我们可以通过在Go的测试文件中编写特殊格式的函数来创建基准测试。测试文件的命名遵守原函数名称_test.go 的格式。 基…...

docker容器的基本操作
一、查看Docker的版本信息 [roothuyang1 ~]# docker version 二、查看docker的详细信息 [roothuyang1 ~]# docker info 三、Docker镜像操作 Docker创建容器前需要本地存在对应的镜像,如果本地加载不到相关镜像,Docker默认就会尝试从镜像仓库https://hu…...

MySQL绿色安装和配置
1、 从地址http://dev.mysql.com/downloads/mysql/中选择windows的版本下载。 2、 mysql各个版本的简介 (1) MySQL Community Server 社区版本,开源免费,但不提供官方技术支持。 (2) MySQL Enterprise Ed…...

《cuda c编程权威指南》03 - cuda小功能汇总
1. 计时 1.1 linux #include <sys/time.h>double cpuSecond() {struct timeval tp;gettimeofday(&tp, NULL);return ((double)tp.tv_sec (double)tp.tv_usec*1e-6); }// 调用 double start cpuSecond(); kernel_name << <grid, block >> > (ar…...

Java:Java程序通过执行系统命令调用Python脚本
本文实现功能:Java程序调用Python脚本 Python脚本 import sysdef add(x, y):return x yif __name__ "__main__":print(add(int(sys.argv[1]), int(sys.argv[2])))直接执行 $ python math.py 1 2 3Java程序调用Python脚本 package io.github.mouday.…...

this is incompatible with sql_mode=only_full_group_by
查看配置 select global.sql_mode 在sql命令行中输入select sql_mode 能够看到sql_mode配置,如果有ONLY_FULL_GROUP_BY,则需要修改 在mysql5.7.5后,ONLY_FULL_GROUP_BY是默认选项,所以就会导致group by的问题 set sql_mode‘复制去掉ONLY_F…...

GCC编译选项
当使用GCC编译器时,可以根据不同的需求选择适当的编译选项来控制编译过程和生成的代码的行为。以下是一些常见的GCC编译选项的归纳: 优化选项: -O0: 不进行优化,保留原始的C代码结构。-O1: 启用基本优化级别,进行简单…...

信息安全战线左移!智能网联汽车安全亟需“治未病”
当汽车由典型的工业机械产品逐步发展成为全新的智能移动终端,汽车的安全边界发生了根本性改变,信息安全风险和挑战不断增加。 面对复杂的异构网络、异构系统及车规级特异性要求,智能智能网联汽车信息安全到底要如何防护,已经成为…...

服务器介绍
本文章转载与b战up主谈三国圈,仅用于学习讨论,如有侵权,请联系博主 机架型服务器 堆出同时服务百万人次机组 刀型服务器 服务器炸了 比如用户访问量暴增 超过机组的峰值处理能力,进而导致卡顿或炸服, 适合企业的塔式…...

Java_25_方法引用
方法引用 方法引用: 方法引用是为了进一步简化Lambda表达式的写法。 方法引用的格式:类型或者对象::引用的方法。 关键语法是:“::” 小结:方法引用可以进一步简化Lambda表达式的写法。关键语法是:“::”范例代码&…...

QT基于TCP协议实现数据传输以及波形绘制——安卓APP及Windows程序双版本
文章代码有非常非常之详细的解析!!!诸位可放心食用 这个玩意我做了两个,一个是安卓app,一个是Windows程序。代码并非全部都是由我从无到有实现,只是实现了我想要的功能。多亏了巨人的肩膀,开源…...

mac 中 brctl 怎么用
mac 中 brctl 怎么用 mac 中 brctl 怎么用1.使用 Homebrew 安装 bridge2.安装完成后,你可以使用 bridge 命令来管理网络桥接。 mac 中 brctl 怎么用 在 macOS 中,没有官方提供的 brctl 命令行工具。但是,你可以使用一个名为 bridge 的开源工…...

20.2 HTML 常用标签
1. head头部标签 <head>标签用于定义网页的头部, 其中的内容是给浏览器读取和解析的, 并不在网页中直接显示给用户. <head>标签通常包含以下一些常见的子标签: - <title>: 定义网页的标题, 在浏览器的标题栏或标签页上显示. - <meta>: 用于设置网页的…...

mysql_2.5——【约束】详解
1、查看约束 SHOW CREATE TABLE table_name 2、主键约束(PRIMARY KEY) 主键约束最显著的特征是主键列中的值是不允许重复(唯一)的,通过主键约束可强制表 的实体完整性。当创建或更改表时可通过定义 primary key 约束来创建主键。一个表只 能有一个primary key约束…...

回归预测 | MATLAB实现POA-CNN-BiLSTM鹈鹕算法优化卷积双向长短期记忆神经网络多输入单输出回归预测
回归预测 | MATLAB实现POA-CNN-BiLSTM鹈鹕算法优化卷积双向长短期记忆神经网络多输入单输出回归预测 目录 回归预测 | MATLAB实现POA-CNN-BiLSTM鹈鹕算法优化卷积双向长短期记忆神经网络多输入单输出回归预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 MATLA…...

opencv顺时针,逆时针旋转视频并保存视频
原视频 代码 import cv2# 打开视频文件 video cv2.VideoCapture(inference/video/lianzhang.mp4)# 获取原视频的宽度和高度 width int(video.get(cv2.CAP_PROP_FRAME_WIDTH)) height int(video.get(cv2.CAP_PROP_FRAME_HEIGHT))# 创建视频编写器并设置输出视频参数 fourcc …...

【LeetCode】最小路径和
最小路径和 题目描述算法流程编程代码 链接: 最小路径和 题目描述 算法流程 编程代码 class Solution { public:int minPathSum(vector<vector<int>>& grid) {int m grid.size();int n grid[0].size();vector<vector<int>> dp(m1,vector<in…...

zygote forkSystemServer及systemServer启动
###zygote forkSystemServer方法 通过上一篇文章我们了解到zygote 在ZygoteInit.java类的main方法中调用forkSystemServer方法 UnsupportedAppUsagepublic static void main(String[] argv) {ZygoteServer zygoteServer null;....省略部分代码//根据环境变量(LocalServerSocke…...

享元模式-提供统一实现对象的复用
下围棋时,分为黑白棋子。棋子都一样,这是出现的位置不同而已。如果将每个棋子都作为一个独立的对象存储在内存中,将导致内存空间消耗较大。我们可以将其中不变的部分抽取出来,只存储它的位置信息来实现节约内存。 图 围棋 1 享元模…...

Jenkins工具系列 —— 在Ubuntu 18.04上安装各种版本OpenJDK
文章目录 安装java方式一、使用apt-get工具安装方式二、手动安装java 卸载java各种版本OpenJDK安装包下载 安装java 方式一、使用apt-get工具安装 1、安装各种JAVA版本 若要安装新版本的java11,安装命令: sudo apt install default-jre若选择安装jav…...

vue基础-虚拟dom
vue基础-虚拟dom 1、真实dom目标2、虚拟dom目标 1、真实dom目标 在真实的document对象上,渲染到浏览器上显示的标签。 2、虚拟dom目标 本质是保存节点信息、属性和内容的一个JS对象 更新会监听变化的部分 给真实的DOM打补丁...

C#时间轴曲线图形编辑器开发2-核心功能实现
目录 三、关键帧编辑 1、新建Winform工程 (1)界面布局 (2)全局变量 2、关键帧添加和删除 (1)鼠标在曲线上识别 (2)键盘按键按下捕捉 (3)关键帧添加、删…...

【Git】初始化仓库配置与本地仓库提交流程
目录 一、仓库配置邮箱与用户名 二、本地仓库提交流程 一、仓库配置邮箱与用户名 【Git】Linux服务器Centos环境下安装Git与创建本地仓库_centos git仓库搭建_1373i的博客-CSDN博客https://blog.csdn.net/qq_61903414/article/details/131260033?spm1001.2014.3001.5501 在…...

学习day53
今天主要是做一个案例 TodoList 组件化编码流程: 1. 拆分静态组件:组件要按照功能点拆分,命名不要与html元素冲突 2.实现动态组件:考虑好数据的存放位置,数据是一个组件在用,还是一些组件在用:…...
【最短路算法】SPFA
引入 在计算机科学的世界里,算法就像是星空中的繁星,各自闪烁着智慧的光芒。它们沉默而坚定,像是一群不语的哲人,默默地解答着世界的问题。 算法的步骤,如同优美的诗行,让复杂的问题在流转的字符中得以释…...

牛客网Verilog刷题——VL48
牛客网Verilog刷题——VL48 题目答案 题目 在data_en为高期间,data_in将保持不变,data_en为高至少保持3个B时钟周期。表明,当data_en为高时,可将数据进行同步。本题中data_in端数据变化频率很低,相邻两个数据间的变化&…...

Unity UGUI的Shadow(阴影)组件的介绍及使用
Unity UGUI的Shadow(阴影)组件的介绍及使用 1. 什么是Shadow(阴影)组件? Shadow(阴影)组件是Unity UGUI中的一个特效组件,用于在UI元素上添加阴影效果。通过调整阴影的颜色、偏移、模糊等属性,可以使UI元素看起来更加立体和有层次感。 2. …...

Kubernetes系列
文章目录 1 详解docker,踏入容器大门1.1 引言1.2 初始docker1.3 docker安装1.4 docker 卸载1.5 docker 核心概念和底层原理1.5.1 核心概念1.5.2 docker底层原理 1.6 细说docker镜像1.6.1 镜像的常用命令 1.7 docker 容器1.8 docker 容器数据卷1.8.1 直接命令添加1.8.2 Dockerfi…...