Swift 周报 第三十三期

news2025/2/3 2:57:34

在这里插入图片描述
在这里插入图片描述

文章目录

    • 前言
    • 新闻和社区
      • 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论坛

  1. 讨论这些是错别字吗?

提问:

在观看 SwifUIi 视频时,看到两处看起来像是拼写错误的东西。想知道为什么它们的表达如此含糊:

反斜杠有什么用?

var body: some View {
    List (graphics, children: \.children) { graphic in
        GraphicRow (graphic)
    }
    .listStyle(SidebarListStyle())
}

美元符号有什么用?

var body: some View {
    DocumentGroup (newDocument: SketchDocument()) { file in
        DocumentView(file.$document)
    }
}

回答:

这些不是拼写错误。它们是用于访问特定语言功能的符号,这些功能会生成与命名属性相关的内容,而不是正常访问该属性。

Swift 在前缀运算符位置中使用 \ 来创建“关键路径”,该对象通常表示(在本例中)Graphic.children 属性,而不是特定 GraphicChildren 属性;该对象可以应用于 Graphic 的任何实例以访问其 Children 属性。

在其他语言中,\ 字符在字符串文字中很常见,它开始一个“转义序列”,但它很少用作运算符,并且使用它的语言之间几乎没有一致性。

这里与“转义”的想法有某种模糊的联系,因为在这两种情况下,你都在逐步提升到更抽象的含义水平,但在大多数情况下,它被选择是因为它是一个未使用的符号,通常是 易于打字并且看起来不错。 该功能的演变提案实际上讨论了几种不同的语法,并解释了为什么选择反斜杠。

$ 前缀意味着您正在访问相关属性的属性包装器提供的特殊功能。在这里,该属性是 FileDocumentConfiguration.document,根据文档有一个 @Binding 属性包装器。 这意味着 $document 将公开一个到文档的 Binding - 一个可用于访问和修改该文档属性的对象,而无需关心它实际存储的位置。

我们将此 $ 变量称为“投影值”而不是“绑定值”或其他任何名称,因为 $ 语法是通用语言功能,因此如果您使用 @Binding 以外的其他内容,$ 属性可能不会创建绑定;可能被赋予一些其他功能。

选择这两种语法并不是因为它们会立即熟悉,而是因为我们确定没有一种语法可以立即熟悉,最好选择开发人员需要学习但一旦学习后会发现易于使用的语法。

  1. 讨论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 in
             lock.lock()
             c.resume()
         })
     */
}

func thirdPartyLibUnlock() {
    print("- do sum work and unlock")
    lock.unlock()
    /*
     I also tried to replace it with:
         await withCheckedContinuation({ c in
             lock.unlock()
             c.resume()
         })
     */
}

func example() {
    /*
     Console:
     - start 4
     - do sum work and lock
     - start 1
     - do sum work and lock

     And 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 对在设计上是不安全的,这就是其中之一。 更好的设计是使用一个函数来获取锁,调用回调,然后在回调返回后释放锁。

(理想情况下,该函数还可以提供对受锁保护的资源的回调访问,否则将无法访问。)只需使整个过程同步,就可以非常巧妙地表达在锁定和解锁之间不挂起的要求。

  1. 讨论所需的 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++ 互操作而不要求依赖项了解它?

  1. 讨论将协议添加到同名模块
    提问:

我有一个名为 HTML 的模块,其中包含同名的类型 HTML。 它的树看起来像这样:

  • HTML(模块)
  • HTML(结构)
  • HTML.属性(枚举)
  • HTML.ContainerElement(枚举)
  • HTML.VoidElement(枚举)

到目前为止,一切都很好。 不可能限定对该模块中的声明的引用,因为它是同名的,但这没关系,因为 HTML 类型本身在功能上是命名空间限定符。

现在想向这个模块添加一个协议,称之为 HTMLOutputStreamable。但是不能向未命名为 HTML 的 HTML 模块添加顶级类型,因为该模块是同名的,并且无法使用 HTML.HTMLOutputStreamable 来限定对此协议的引用。

该如何解决这个问题?

回答:

我发现的唯一方法就是使用不同的名称。

从这个角度来看,Swift 仍然缺少完整的命名空间功能。 可以是模块级命名空间,但更完整和可靠。 我更喜欢像 C++ 那样的命名空间,或者像 Rust 那样的显式模块定义,但这似乎不是 Swift 进化愿景的一部分。

  1. 讨论嵌套函数和 @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 元,你的月薪处于什么水平?

  1. 巨富
  2. 小富
  3. 小康

欢迎在文末留言参与讨论。

关于我们

Swift社区是由 Swift 爱好者共同维护的公益组织,我们在国内以微信公众号的运营为主,我们会分享以 Swift实战SwiftUlSwift基础为核心的技术内容,也整理收集优秀的学习资料。

特别感谢 Swift社区 编辑部的每一位编辑,感谢大家的辛苦付出,为 Swift社区 提供优质内容,为 Swift 语言的发展贡献自己的力量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/762339.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

公网访问的Linux CentOS本地Web站点搭建指南

文章目录 前言1. 本地搭建web站点2. 测试局域网访问3. 公开本地web网站3.1 安装cpolar内网穿透3.2 创建http隧道,指向本地80端口3.3 配置后台服务 4. 配置固定二级子域名5. 测试使用固定二级子域名访问本地web站点 前言 在web项目中,部署的web站点需要被外部访问,则…

常规函数和箭头函数之间的主要区别

常规函数和箭头函数之间的主要区别 在 JavaScript 中,函数是设计用于执行特定任务的代码块。函数允许使用函数将大型程序分解为多个更小、更易于管理的组件。因此,我们就不再需要重复编写相同的代码。 JavaScript中有两种类型的函数 常规函数箭头函数…

jmeter如何进行web脚本录制

目录 录制web脚本 (1)jmeter中设置HTTP代理 (2)浏览器中设置代理 (3)页面操作 (4)查看录制的web脚本 (5)脚本内容过滤 (6)脚本优化…

练习 数列前n项和(递归函数)

C++自学精简教程 目录(必读) 数列的前n项和 S = 1 + 2 + 3 + ...... + n 之前我们用for循环求解数列前n项和,本文用递归函数求解。 代码如下 #include <iostream> using namespace std;int f(int a) {if (a == 1){return 1;}else{return a + f(a - 1);} }int main(…

APP外包开发中的H5框架

在开发APP的技术中&#xff0c;除了原生开发外也可以使用H5框架来开发。原生开发的特点是质量高&#xff0c;用户体验更好&#xff0c;但成本高&#xff0c;适用于对质量要求高的APP项目。H5框架的特点是通用性较强&#xff0c;对开发人员的要求相对较低&#xff0c;成本也低&a…

从小众到大热:海外网红营销的成功之道

在当今数字时代&#xff0c;社交媒体已经成为人们获取信息、沟通交流的主要渠道之一。而在这个社交媒体的浪潮中&#xff0c;海外网红营销逐渐从小众走向大热。它以其独特的营销模式和广泛的受众群体&#xff0c;成为许多品牌和企业的首选营销方式。本文Nox聚星将详细介绍海外网…

高等学校节能监控平台的具体应用 安科瑞 许敏

摘要&#xff1a;高校节能监控平台&#xff0c;主要是通过物联网技术实现对水、电、气等高耗能设备进行计量和控制&#xff0c;为高校能耗的分析&#xff0c;能源流向&#xff0c;节能目标提供有力的数据支撑。高效节能监控平台主要包括能耗监测系统、照明节能控制系统、空调节…

Gtest在ARM平台上的离线搭建(让Gtest编译安装成功之后的可执行文件.so变成ARM下的—ARM aarch64)(实用篇)

编译时自动调用Cunit或者Gtest的静态或者动态库文件说明拷贝Gtest安装包到新目录下根目录下创建build目录并且进行编译检查生成的库文件是否属于ARM架构下的将库文件拷贝到统一的ARM包下面编译时自动调用Cunit或者Gtest的静态或者动态库文件说明 这里之前在usr/local/lib下面安…

Springboot工程常见错误

1. mybatis的mapper.xml出现tag name expected错误 https://blog.csdn.net/watson2017/article/details/128902300 <符号在xml配置SQL 语句中是不能直接识别出来的&#xff0c;也就是说&#xff0c;我们在使用到 > 、< 等符号的时候&#xff0c;需要将其进行转义&…

LaTex 的基本使用方法

TeXstudio 设置新建和编辑文档编译和预览拼写检查宏和脚本 LaTex 分模块详解 LaTex 文件头 documentclass article&#xff1a;用于写短篇文章、报告report&#xff1a;用于写长篇报告、学位论文、技术报告等book&#xff1a;用于编写书籍&#xff0c;具有章节、子章节和节的…

leetcode 77. 组合

2023.7.17 今天正式开始回溯系列&#xff0c;这是一道经典回溯题。 先上一个经典回溯模板&#xff1a; void backtracking(参数) {if (终止条件) {存放结果;return;}for (选择&#xff1a;本层集合中元素&#xff08;树中节点孩子的数量就是集合的大小&#xff09;) {处理节点…

飞行动力学 - 第10节-空间机动性、稳定性与操纵性概述 之 基础点摘要

飞行动力学 - 第10节-空间机动性、稳定性与操纵性概述 之 基础点摘要 1. 协调盘旋性能计算流程2. 一般盘旋2.1 动力学方程2.2 角点速度2.3 典型战斗机盘旋曲线 3. 空间机动能力4. 飞行动力学&#xff1a;飞行性能稳定性与操纵性5. 稳定性定义6. 飞行品质6.1 品质等级6.2 品质评…

大数据测试之数据仓测试怎么做(上)

前面的文章我们为大家介绍了大数据测试平台和大数据系统的测试方法&#xff0c;接下来我们重点来讲一下数据仓库测试&#xff0c;首先看一下它的定义。 数据仓库(Data Warehouse)&#xff1a;一个面向主题的&#xff08;Subject Oriented&#xff09;、集成的 &#xff08;In…

给学弟妹们的 10 个秋招建议!

大家好&#xff0c;我是鱼皮。最近很多大公司的提前批陆陆续续开启了&#xff0c;说明秋招已经拉开了序幕&#xff0c;大家要准备起来了。 所以我也赶紧写了一篇文章&#xff0c;结合自己曾经大厂求职的经验&#xff0c;并且从招聘方的角度&#xff0c;给学弟妹们一些秋招找工…

机器人架构设计和中间件

一&#xff0e;引言 在无人驾驶与机器人领域&#xff0c;算法一直都是研究的核心。无论是导航技术、控制技术&#xff0c;还是识别技术都是构成其技术栈的重要组成部分。但是&#xff0c;随着技术的发展&#xff0c;开发者们逐渐认识到一个问题&#xff0c;即程序本身的组织架构…

善用AI; AI生成美女图片中隐藏汉字,光影艺术引爆网络讨论

&#x1f989; AI新闻 &#x1f680; AI生成美女图片中隐藏汉字&#xff0c;光影艺术引爆网络讨论 摘要&#xff1a;近期&#xff0c;一组AI生成的美女图片在网络上疯传&#xff0c;用户发现这些图片中隐藏了汉字。这种光影艺术效果引起了广泛关注和讨论。AI绘画工具ControlN…

红外雨量计(光学雨量传感器)在小型气象站的应用

红外雨量计&#xff08;光学雨量传感器&#xff09;在小型气象站的应用 红外雨量计是一种常见的气象测量设备&#xff0c;也是小型气象站中一个重要的组成部分。随着现代科技的发展&#xff0c;红外雨量计逐渐取代了传统的测雨器&#xff0c;成为广大气象从业人员的首选设备。…

新建Proteus工程文件以及51单片机的最小系统的绘制和简单介绍

一、新建Proteus工程 1.创建一个新的文件夹存放工程 2.打开Proteus 8软件&#xff0c;界面如图所示 3.点击【新建工程】 4.填写工程名称&#xff0c;选择工程保存路径&#xff08;步骤1中创建的新文件夹&#xff09;后点击【Next】 5.选择【从选中的模板中创建原理图】,选择具体…

startqueue(模拟实现及底层原理)

目录 容器适配器 STL标准库中stack和queue的底层结构 ​deque deque的原理 deque的缺陷 为什么选择deque作为stack和queue的底层默认容器 stack stack的介绍 stack的函数 stack的模拟实现 queue queue的介绍 queue的函数 queue的模拟实现 priority_queue prior…

opencv基础09-图像运算之-加法运算(图像增强预处理)

opencv基础09-图像运算 什么是图像运算&#xff1f; 在图像处理过程中&#xff0c;经常需要对图像进行加法运算。可以通过加号运算符“”对图像进行加法运算&#xff0c;也可以通过 cv2.add()函数对图像进行加法运算。 通常情况下&#xff0c;在灰度图像中&#xff0c;像素用…