前语

本期是 Swift 修改组自主收拾周报的第十八期,每个模块已开始成型。各位读者假如有好的提议,欢迎在文末留言。

欢迎投稿或引荐内容。现在方案每两周周一发布,欢迎情投意合的朋友一起参加周报收拾。

再暗的黑夜也会迎来黎明,再长的崎岖也会衔接平川。怀有Swift社区,一颗永不抛弃的期望之心,明日将会是温暖的阳光雨露!

周报精选

新闻和社区:因增速放缓 苹果公司将敞开大规模收买

提案:Package Manager 支撑自界说宏

Swift 论坛:评论为什么 didSet 调查者在运用中会触发 Set 类型的特点

引荐博文:在 SwiftUI 中把握 Canvas 的运用

论题评论:

你存钱了吗?你存钱的意图是什么呢?

新闻和社区

苹果公司向“康复基金”再投2亿美元,推进碳移除项目

Swift 周报 第二十七期

据界面新闻音讯,苹果公司 4 月 12 日宣布,在最初 2 亿美元的出资根底上,将向 2021 年建立的“康复基金”(Restore Fund)再投多达 2 亿美元。该基金旨在为高质量的自然碳移除项目供给资金,鼓励全球出资维护和康复“关键生态系统”。苹果公司还期望协助无法经过现有技能避免或削减碳排放的企业,推行可行的碳移除解决方案。

加码后的基金将由汇丰财物管理部门和 Polliation 合资成立的 Climate Asset Management 管理,额定出资估计将使苹果此前提出的每年从大气中铲除 100 万公吨二氧化碳方针翻倍,同时为出资者带来经济回报。

该基金期望把重点放在面向自然的农业项目以及维护和康复关键生态系统的项目上,前者将协助公司从可继续管理的农业实践中获得收入,后者则能从大气中移除并贮存二氧化碳。苹果公司表明,“康复基金”的出资将遵循“严厉的社会和环境规范”。

因增速放缓 苹果公司将敞开大规模收买

【环球网科技综合报导】4 月 7 日音讯,据外媒报导称,苹果公司现在具有超越 1650 亿美元的现金储备,鉴于苹果公司当时增速放缓,这家公司未来会敞开大规模的收买。

不过,和微软、亚马逊等大手笔收买类型不同,苹果公司更倾向于收买小型草创公司。

外媒称,苹果喜欢以培育、孵化的办法开展收买,并耐性等候这些草创公司生长,来撬动新的市场。

据此前报导,本年 2 月,苹果收买了坐落加州的 AI 算法公司 WaveOne 。本年 3 月,苹果公司现已收买了英国敞开银行草创公司 CreditKudos 。

据了解,苹果常常收买小型企业,以加强其技能和专业知识,但显然没有或立行将其推行到产品或服务中。另一方面,许多收买的确成为苹果生态系统的关键部分。近年来,苹果现已收买了音乐识别服务 Shazam 和自动驾驶汽车公司 Drive.ai 等企业。

Swift Student Challenge 现已敞开请求

Swift 周报 第二十七期

咱们很高兴能自始自终地为世界各地酷爱编程的学生供给长时间支撑。欢迎运用 Swift Playgrounds 或 Xcode 编写 App Playground (主题自选) 并提交你的杰作,向咱们展现你对于编程的酷爱。优胜者将获得奖项和赞誉,以及额定奖励。

提案

经过的提案

SE-0393 Value 和 Type 参数包 提案经过检查。该提案已在 二十六期周报 正在检查的提案模块做了详细介绍。

正在检查的提案

SE-0394 Package Manager 支撑自界说宏 提案正在检查。

宏供给了一种扩展 Swift 的办法,经过对输入源代码履行恣意语法转化来生成新代码。该提案涵盖了怎么将自界说宏作为 Swift 软件包的一部分进行界说、构建和分发。

SE-0395 Observation 提案正在检查。

该提案界说了什么是可调查的引证,调查者需求遵守什么,以及类型与其调查者之间的联系。这种规划形式是许多言语都支撑的,Swift 引进之后,无疑将愈加强壮、安全和高性能。

Swift论坛

  1. 提议可变泛型类型笼统包

介绍

之前的 SE-0393 引进了类型参数包和几个相关概念,答应泛型函数声明笼统出可变数量的类型。 该提案将这些主意归纳为泛型类型声明。

动机

当企图在调集上归纳通用算法时,自然会出现对可变数量的类型进行笼统的通用类型声明。 例如,惰性 ZipSequence 或许在两个序列上是通用的。 能够声明一个 ZipSequence 类型,它将固定序列列表的元素表明为元组序列:

struct ZipSequence<each S: Sequence>: Sequence {
  typealias Element = (repeat each S.Element)
  let seq: (repeat each S)
  func makeIterator() -> Iterator {
    return Iterator(iter: (repeat (each seq).makeIterator()))
  }
  struct Iterator: IteratorProtocol {
    typealias Element = (repeat each S.Element)
    var iter: (repeat each S.Iterator)
    mutating func next() -> Element? {
      return ...
    }
  }
}

建议的解决方案

在泛型类型的泛型参数列表中,each 关键字声明晰一个泛型参数包,就像它在泛型函数的泛型参数列表中所做的那样。 存储特点的类型能够包含包扩展类型,如上面的 let seq 和 var iter。

  1. 讨观点前缀被以为是丑陋的

尽管咱们现已习惯了,但在静态成员和枚举常量前加上点会引进视觉噪音,看起来太聪明晰,总是让我的其他言语背景的搭档感到惊奇:

func foo(_ v: Color) {...}
object.foo(.red) // 

在声明中缺少点前缀之间也存在这种令人不安的不对称性:

enum Color {
    case red
    case green
    static var blue = ...
}

并在其他地方运用这些前缀:

switch color {
    case .red: break
    case .green: break
}
foo(.red)
foo(.blue)

风趣的是,我现已能够在某些上下文中运用“object.foo(red)”(例如,在 Color 的静态办法中),但不能在其他上下文中运用。

我很欣赏这将是一个突破性的改变,咱们不或许在现阶段迅速适应这一改变。 暂时忘掉这一点,你以为 Swift 经过以下更改会变得更好仍是更糟?

func foo(_ v: Color) {...}
...
object.foo(Color.red) // ok
object.foo(.red)      //  prohibited
object.foo(red)       // ✅
switch color {
    case .red: break  //  prohibited
    case red: break   // ✅
}
dispatchPrecondition(condition: .onQueue(.main)) // 
dispatchPrecondition(condition: onQueue(main))   // ✅
bar(.init()) // 
bar(init())  // ✅
// While choosing what "red" to use – follow these new resolution rules:
// - use local variable if exists
// - or use instance variable if exists (in which case self should be captured strongly explicitly or implicitly)
// - or use static variable if exists (in case of enum could be an enumeration constant)
// - or use global variable if exists
// - otherwise emit an error
  1. 评论非 Sendable 类型能够在 Tasks 中捕获吗?

现在,我猜想下面的代码应该会出现任何过错。

class SomeClass {
    var count: Int
    init(count: Int) {
        self.count = count
    }
}
let someClass = SomeClass(count: 0)
//public init(priority: TaskPriority? = nil, operation: @escaping @Sendable () async -> Success)
Task {
    someClass.count += 1
}
//public init(priority: TaskPriority? = nil, operation: @escaping @Sendable () async -> Success)
Task {
    someClass.count += 1
}

但是,在 Swift(5.8 版)中,此代码片段能够编译。 在 Swift6 中,这段代码有没有出现过错?

答复:

在 Swift v.Future 中,全局 someClass 有必要与全局 actor 阻隔,因此行 someClass.count += 1 将需求:

整个 Task 闭包被阻隔到同一个global actor,或许您为该操作切换到适当的global actor (例如:await MainActor.run { someClass.count += 1 })很难精确地说出在 Swift 6 中什么会/不会是过错。您能够运用一些编译器标志来尝试一些事情,但它们是不一致的。

  1. 评论为什么 didSet 调查者在运用调集中已有的值调用刺进后会触发 Set 类型的特点?

Xcode Playground 中的以下代码片段:

import UIKit
var collection = Set<String>() {
    didSet {
        print("didSet")
    }
}
collection.insert("Test1")
collection.insert("Test2")
collection.insert("Test1")
collection.insert("Test3")
print("Done")

为什么是输出:

didSet
didSet
didSet
didSet
Done

而不是:

didSet
didSet
didSet
Done

为什么当调集未更改时它会触发,由于该值现已在调集中?

答复:

每个mutating函数都会像这样。 没有特殊的机制能够让特点知道 Set 没有在内部被修改。

  1. 评论可变参数泛型的同时简略但或许丧命复杂的运用

我很猎奇行将到来的可变参数泛型特性是否能让咱们完成像 transform(::) 这样的函数,你能够在下面看到它的运用:

extension String {
    var hasPrimeNumberOfCharacters: Bool {
        transform(
            self,
            { $0.count },
            { $0.isPrime }
        )
    }
}

该函数选用一个强制性的第一个参数,即要转化的值,然后是一个可变的转化闭包列表,每个闭包都对它之前的闭包的输出类型进行操作,第一个对初始值进行操作。 在上面的例子中,参数是:String, (String)->Int, (Int)->Bool。

我现已阅读了大量的可变参数泛型文档,假如我现在有必要给出我最好的猜想,我会说我的 transform(::) 函数在可变参数泛型的第一次迭代中是不或许的。

下面是一个非常大略的草图,它是我能幻想到的最接近怎么编写这样一个函数签名的草图。 我发现有必要发明许多新的语法,这支撑了我的猜想,即这是不或许的,至少在最初是不或许的。

func transform
    <InitialValue,
     each (T, U)>
    (_ initialValue: InitialValue,
     _ transform: repeat each (T)->U)
-> last U or InitialValue
where first T == InitialValue {
    // How would one even implement this if the above syntax were valid?
}
  1. 评论为 Debian/Ubuntu 构建发行版?

现在我期望在 Jetson Nano(它有一个 ARM Cortex-A57 CPU)上用 Swift 做一个机器人项目,它只能运用 Ubuntu 18.04。 18.04 没有预构建的 5.8 .deb 包,这有点苦楚,由于这意味着我有必要从源代码构建,而且一些构建依靠项(例如 cmake)有必要从源代码构建才能获得最新的 满足的版本。 我以前构建过东西链,现在我正在 Jetson Nano 上构建它,但它花费了很长时间,尽管构建在衔接的 SSD 上(操作系统运行在 SD 卡上)。

我想知道在我的 M1 Max MacBook Pro 上的 Ubuntu 18.04 Docker 容器(或许或许是 Parallels VM)中构建东西链是否有意义,然后构建将正确装置在任何 18.04 ARM 机器上的东西链的 .deb。

你以为那会制作得更快吗?

是否存在对构建 .deb 包的支撑? 20.04 和 22.04 包是怎么构建的?

答复:

另一种选择是构建 MacOS -> 18.04 交叉编译东西链。 不久前,我将 x-compiler 装备移到了 focus,但要翻转回 bionic 装备应该很简单。

  1. 发布Swift 5.8 发布!

链接: www.swift.org/blog/swift-…

您或许现已看到,Swift 5.8 现已正式发布! :tada: 此版本包含对言语和规范库的首要弥补,包含支撑逐渐选用行将推出的功用的 hasFeature、改善的开发人员体会、改善 Swift 生态系统中的东西,包含 Swift-DocC、Swift Package Manager 和 SwiftSyntax,经过改善 Windows 支撑等。

引荐博文

在 SwiftUI 中把握 Canvas 的运用

摘要: 文章介绍了怎么运用 Canvas 视图在 SwiftUI 中制作 2D 图形,而无需运用 Shape API 。在 Canvas 视图中,咱们能够运用 GraphicsContext 实例进行绘图,调整透明度、缩放和混合形式等参数,并添加不同的滤镜。 Canvas 还供给了 stroke、 fill 和 clip 函数,答应咱们制作任何咱们需求的路径,同时也供给了draw函数,答应咱们制作文本和图像。咱们能够运用 Canvas 类型制作任何 SwiftUI 视图,但需求在创立 Canvas 时运用 symbols 闭包中注册它们。尽管 Canvas 视图不支撑动画,但能够经过将其嵌入到带有动画调度程序的 TimelineView 中来完成动画作用。 Canvas 视图没有辅佐功用树,但能够附加一组辅佐视图修饰符,以使每个人都能够拜访其内容。

监听 SwiftUI ScrollView 的内容偏移量

摘要: 文章介绍了怎么监听 SwiftUI ScrollView 的内容偏移量。在构建可翻滚的 UI 时,一般需求调查当时翻滚方位以便进行操作,但现在(在撰写本文时)SwiftUI 的 ScrollView 没有内置的办法来履行此类翻滚调查。作者供给了一种运用 GeometryReader 解析器并运用 PreferenceKey 类型来完成的办法,使咱们能够调查当时的内容偏移。终究作者完成了一个名为 OffsetObservingScrollView 的自界说翻滚视图,能够完成监听当时内容偏移量的功用。

Swift 中怎么将不透明返回类型与首要相关类型相结合

摘要: 文章介绍了 Swift 5.7 引进的主相关类型和不透明返回类型相结合的运用办法。经过声明主相关类型,咱们能够在运用 some 关键字时避免类型擦除,并使代码愈加类型安全。该功用不仅适用于 Combine 框架,还能够在处理自己的泛型协议时运用。

论题评论

4月11日,央行公布了2023年一季度的金融数据,居民超额存款三年10.8万亿:北京人均存款已接近27万,上海人均超21万。你存钱了吗?你存钱的意图是什么呢?

  1. 有安全感:为了应对赋闲、突发疾病等,避免因意外事件而出现经济困难。
  2. 完成个人方针:买房、买车、旅行等,经过积累资金来完成自己的愿望。
  3. 出资理财:经过出资股票、基金、房地产等财物来添加财富,完成长时间的财政方针。
  4. 应对退休日子:经过积累养老金和退休金来保障自己的日子质量和经济安全。
  5. 没有存款:开销根本等于收入,实在是存不了钱。

欢迎在文末留言参加评论。

关于咱们

Swift社区是由 Swift 爱好者一起维护的公益组织,咱们在国内以微信大众号的运营为主,咱们会分享以 Swift实战SwiftUlSwift根底为核心的技能内容,也收拾收集优秀的学习材料。

特别感谢 Swift社区 修改部的每一位修改,感谢大家的辛苦付出,为 Swift社区 供给优质内容,为 Swift 言语的开展贡献自己的力气。

本文正在参加「金石方案」