前语

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

欢迎投稿或引荐内容。现在计划每两周周一发布,欢迎情投意合的朋友一同加入周报整理。

最无情的永久不是环境,而是缺少勇气的心里。Swift社区与你一同,赤胆平浊世,蛇矛定江山!

周报精选

新闻和社区:忧虑泄密!外媒:苹果公司约束职工运用ChatGPT

提案:value 包翻开的元组

Swift 论坛:谈论 Xcode 疏忽 Package.resolved 文件

引荐博文:万字长文详解怎么运用 Swift 进步代码质量

论题谈论:

一群男的在找女朋友,一群女的在找男朋友,两群人互不干涉,什么原因引起的?

上期论题成果

Swift 周报 第二十九期

上期论题谈论成果表明关于 AI 是否会替代软件工程师的问题,大家的观念存在分歧,而实践的成果或许取决于 AI 技术的开展和与人类工程师的协作方式的演变。让咱们拭目以待。

新闻和社区

忧虑泄密!外媒:苹果公司约束职工运用ChatGPT

中新经纬 5 月 19 日电 据华尔街日报中文网 19 日报导,其得悉的一份文件以及知情人士的音讯显现,苹果公司现已约束运用 ChatGPT 和其他外部 AI 东西。

依据这份文件,苹果公司忧虑职工运用这类程序或许会泄露机密数据。该文件还称,苹果公司还告知职工,不要运用微软一切的 GitHub 的产品 Copilot。Copilot 可以主动编写软件代码。

ChatGPT 是 AI 研讨公司 OpenAI 开发的一款人工智能聊天机器人。该产品于 2022 年 11 月发布,可以进行从前史到哲学等论题的对话,并对计算机程序代码供给修正主张。

值得留意的是,在 ChatGPT 爆火的背面,也出现过商业泄密的重大事端。

今年 4 月,据多家媒体报导,三星电子引进聊天机器人 ChatGPT 不到 20 天,便曝出机密资料外泄,如半导体设备丈量数据、产品良率等内容。为杜绝相似事端再产生,三星制定相关维护措施,该公司向职工表示,“若采取信息维护紧急措施后仍产生相似事端,公司内部网络或许会堵截 ChatGPT 连接”。

此外,现已有国家监管安排留意到了数据安全危险。

当地时刻 3 月 31 日,意大利个人数据维护局宣告,即日起禁止运用聊天机器人 ChatGPT ,约束其开发公司 OpenAI 处理意大利用户信息,并开始立案调查。意大利个人数据维护局以为,3 月 20 日 ChatGPT 渠道出现了用户对话数据和付款服务支付信息丢掉状况,而该渠道没有就收集处理用户信息进行告知,且缺少大量收集和存储个人信息的法律依据。(中新经纬APP)

苹果公司大幅削减其MR头显出售预期,不足百万台

品玩 5 月 19 日讯,据界面新闻音讯,苹果公司已将其期待已久的混合现实(MR)头显的出售预期下调约三分之二。报导指出,苹果最初期望每年出售约 300 万台,但现在已将出售预期削减至约 100 万台,随后又下调至 90 万台。该公司将于 6 月 5 日举办全球开发者大会,估计将在会上展现该产品。该设备的价格估计会高达 3000 美元左右,是 Meta Platforms 最昂贵的 Quest Pro 头显价格的三倍。

提案

经过的提案

SE-0396 Never 恪守 Codable 提案经过检查。该提案已在 二十八期周报 正在检查的提案模块做了具体介绍。

SE-0398 答应泛型类型对包进行抽象声明 提案经过检查。该提案已在 二十八期周报 正在检查的提案模块做了具体介绍。

正在检查的提案

SE-0398 value 包翻开的元组 提案正在检查。

之前的 SE-0393 引进了 Value 和 Type 参数包。该提案答应引证一个包含在重复形式中的 value 包的元组值。

Swift 论坛

  1. 谈论SwiftUI 图表、超大数据集和图表叠加

  2. 谈论带有线程安全特点包装器的可发送正告

当运用有针对性的严厉并发进行构建时,我收到一条正告,我想知道除了使我的类型“未经检查的可发送”之外,我是否可以做任何作业。

考虑一些线程安全的特点包装器:

@propertyWrapper struct ThreadSafe<Value: Sendable>: Sendable {
    private let lock: Lock<Value>
    var wrappedValue: Value {
        get { lock.withLock { $0 } }
        set { lock.withLock { $0 = newValue } }
    }
    init(wrappedValue: Value) {
        self.init(lock: .init(initialState: wrappedValue))
    }
    private init(lock: Lock<Value>) {
        self.lock = lock
    }
}

并考虑运用它来强制履行线程安全和可发送性的类:

final class SomeSendable: Sendable {
    @ThreadSafe
    var someBool: Bool = false
}

即便我的课程是线程安全的,我依然收到此正告:

Stored property '_someBool' of 'Sendable'-conforming class 'SomeSendable' is mutable

编译器确诊好像没有检查特点包装器的可发送性。

有没有方法在不使我的类型“未选中”的状况下停息此正告?

答复

问题是任何带有 var 的类总是不行发送的,而且特点包装器不答应 let。

但对我来说,真正的问题是 SomeSendable 运用起来真的不是那么安全,特别是 @ThreadSafe 是不安全的。 它使得以易受竞争影响的方式运用可变状态变得太简略了。 由于数据被确定,您肯定不会遇到运行时崩溃,但您很简略得到不正确的成果。

例如,像旋转 1,000 个使命来切换布尔值这样简略的作业在最终总是会产生一个真值,但有时你会得到假,有时你会得到真:

let object = SomeSendable()
for _ in 1...1000 {
  Task { object.toggle() }
}
try await Task.sleep(for: .seconds(1))
print(object.someBool)

这是一个相当大的问题,它正在产生,由于 @ThreadSafe 答应直接写入底层值。 所以像:

object.someBool = !object.someBool

…隐藏竞争条件。

实践上,您或许应该直接在类中保存 Lock 值,而不是运用 @ThreadSafe 特点包装器,然后仅经过它的 withValue 进行变异。 当然,假如可变数据的安全是最重要的问题,那么您真的应该运用 actor。

  1. 谈论无法在文档注释中运用片段?

我阅读 SE-0356 的方式应该可以在 Swift 包的 Snippets 文件夹中创立一个片段文件,然后经过@Snippet 在我的文档谈论中引证它。

但这好像并不像我预期的那样作业(运用 Xcode 14.3 / Swift 5.8):

@Snippet 给我正告:“符号源文档不支持指令” 显现我记录的类型的快速协助不包括片段。

运用菜单“产品”>“构建文档”生成没有代码片段的文档。

答复

片段在 Swift 5.7 中完结,并可经过 swift-docc-plugin 与 SwiftPM 一同运用,但正如其他人指出的那样,没有与根据 Xcode 的文档作业流集成,由于它运用不同的构建体系。 我会更新提案。

  1. 谈论 Xcode 疏忽 Package.resolved 文件

我不确定这是 SPM 问题仍是 Xcode 问题,但将 SPM 与 Xcode 一同运用时最令人沮丧的阅历之一是它常常疏忽我的 repo 中的 Package.resolved 文件,通常是在切换分支或不同机器之间时。

Package.resolved 文件应该是我的依赖项的真实来历,它永久不该该被疏忽——假如有问题,包解析失利,但永久不要改变我的依赖项。

好像产生的状况是,Xcode 更乐意运用其源缓存中刚好满足包版别要求的库版别,而不是解析文件中的库版别。 例如,我有一个版别要求为“2.2.0 up to next minor”的库。

Package.resolved 文件中有 2.2.3,所以这是我期望一向运用的版别,除非我进行一些会引进抵触的更改。 当我在另一台机器上翻开同一个项目时,出于某种原因它坚持要更改为 2.2.2,大概这是它缓存中的版别。 为什么? 假如可以疏忽已解析文件的意义安在?

答复

我或许遗漏了一些细节,但在更新到 Xcode 14.3 并在咱们的 CI 中面临这个问题时,咱们意识到咱们从未运用 -onlyUsePackageVersionsFromResolvedFile 标志调用 xcodebuild。 现在咱们这样做了,而且 CI 好像尊重咱们的 Package.resolved 文件。

关于咱们来说,这个问题只存在于 Xcode 的 GUI 中。 (与此同时,我相同感到困惑,为什么需求 -onlyUsePackageVersionsFromResolvedFile 而不是 CLI 和 GUI 的默认形式!)

  1. 谈论假如没有 Objective-C 或 Swift,怎么在 C 或 C++ 中从 CGDirectDisplayID 检索显现称号?

我试图在纯 C++(或 C)中从 CGDirectDisplayID 获取显现称号

我可以在 Objective-C++ 中做到这一点,相似于:

#import <Foundation/Foundation.h>
#import <CoreGraphics/CoreGraphics.h>
#import <IOKit/graphics/IOGraphicsLib.h>
#import <Cocoa/Cocoa.h>
#include <string>
bool getDisplayNameForDispID(CGDirectDisplayID dispID,
                             std::string& strOutName)
{
    bool bRes = false;
    strOutName.clear();
    NSArray *screens = [NSScreen screens];
    for (NSScreen *screen in screens)
    {
        NSDictionary* screenDictionary = [screen deviceDescription];
        if(screenDictionary)
        {
            NSNumber* screenID = [screenDictionary objectForKey:@"NSScreenNumber"];
            if(screenID)
            {
                CGDirectDisplayID aID = [screenID unsignedIntValue];
                if(aID == dispID)
                {
                    //Got it
                    NSString* pName = [screen localizedName];
                    strOutName.assign([pName UTF8String], [pName lengthOfBytesUsingEncoding:NSUTF8StringEncoding]);
                    bRes = true;
                    break;
                }
            }
        }
    }    
    return bRes;
}

但是,我不想只是为了完结这一项使命而将这个缓慢的 Objective-C 代码添加到我的项目中。 在低级 C 中,必须有一种方法可以做到这一点。

我知道有一个完整的主题专门谈论它。 由于 CGDisplayIOServicePort 已弃用而且仅回来 0 而且任何后续调用都会履行操作,因而请留意,没有任何解决方法为 macOS Ventura 供给作业。

答复

假如您坚持不直接运用任何 Objective C 代码,您依然可以运用 Objective C 运行时 API 从 C 调用 Objective C API,例如:

Class nsScreen = objc_lookUpClass("NSScreen");
objc_object *screens = objc_msgSend(nsScreen, sel_getUid("screens"));
// Desugaring "fast enumeration" is particularly knarly.
// for (NSScreen *screen in screens)
objc_object *enumerator = objc_msgSend(screens, sel_getUid("objectEnumerator"));
objc_object *screen;
while ((screen = objc_msgSend(enumerator, sel_getUid("nextObject")) != nil) {
    // ...
}
// ...

你会发现它比 Objective C 代码(实践上只是这类函数调用的语法糖)要“愚钝”得多,由于你需求一向转化一切内容。

我也彻底忘记了手动添加内存管理。 你需求保存/释放一大堆东西。 真是一团糟。 假如你可以管理它,我强烈主张将其编译为 Objective C。

  1. 谈论使命撤销是否传播到 URLSession 使命?
let task = Task {
  let (data, response) = try await URLSession.shared.data(from: URL(string: "https://some-image-url.com")!)
  // ...
}

然后我履行 task.cancel(),URLSession 是否也会主动撤销 URLSessionTask? 假设 URLSessionTask 也被撤销好像很粗心,但我找不到关于此事的任何文档。 但是,假如 URLSessionTask 没有主动撤销,那么我不得不运用根据闭包的 URLSession.dataTask(with:,completionHandler:) 来获取对 URLSessionTask 的引证,然后还调用 dataTask.cancel()task.cancel() 之上,这有点奇怪。

答复

import Foundation
func main() async {
    let t = Task {
        do {
            print("\(Date.now): task will start")
            let url = URL(string: "https://postman-echo.com/delay/10")!
            let request = URLRequest(url: url, cachePolicy: .reloadIgnoringLocalCacheData, timeoutInterval: 60.0)
            let (data, response) = try await URLSession.shared.data(for: request)
            print("\(Date.now): task did complete, response: \(response), data: \(data)")
        } catch {
            print("\(Date.now): task did error")
        }
    }
    if true {
        try? await Task.sleep(for: .seconds(1))
        print("\(Date.now): will cancel task")
        t.cancel()
        print("\(Date.now): did cancel task")
    }
    print("\(Date.now): waiting")
    try? await Task.sleep(for: .seconds(60))
}
await main()

打印成果:

2023-05-18 08:18:52 +0000: task will start
2023-05-18 08:18:53 +0000: will cancel task
2023-05-18 08:18:53 +0000: did cancel task
2023-05-18 08:18:53 +0000: waiting
2023-05-18 08:18:53 +0000: task did error
  1. 谈论开展 Swift 作业组

今日,Swift 中心团队宣告对 Swift 的结构、作业和周围的人进行前瞻性的改变。 这些更改包括新的组、称号、安排以及作为每个组的一流概念的包含。

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

引荐博文

万字长文详解怎么运用 Swift 进步代码质量 | 京东云技术团队

摘要: 文章介绍了怎么运用 Swift 进步代码质量。 Swift 的三个重要特性:赋有表现力、安全性和快速。经过运用这些特性,可以进步代码质量并削减 Crash 的产生率。同时,本文还分享了一些实践技巧来进步运用 Swift 编写代码的效率和可读性,如利用编译检查、削减运用 Any/AnyObject 、不引荐大量运用 Dictionary 数据结构等。最终,从功用优化的视点,谈到了运用源代码打包,削减方法动态派发,运用 Slice 共享内存优化功用等来进步代码质量。

swiftUI 中视图叠加的强壮才能

摘要: 本博客文章谈论了 SwiftUI 中两个有趣的叠加运用案例。第一个案例涉及运用叠加来坚持视图的结构标识,这关于避免功用问题和状态丢掉至关重要。第二个用例是经过叠加视图修饰符构建自定义导航转化,使开发人员可以创立流畅的动画而不依赖 NavigationView 或 NavigationStack。供给示例以说明这些概念,并供给其他资源供进一步学习。总体而言,本文展现了 SwiftUI 中叠加功用的强壮之处以及它们怎么增强应用程序开发中用户体会。

SwiftUI 中的文件导入和导出

摘要: 本篇博客谈论了怎么运用 fileImporter 和 fileExporter 视图修饰符在 SwiftU I视图中导入和导出文件。文章包括两种操作的代码示例,以及一个额定部分介绍怎么运用 fileMover 视图修正器进行文件移动。此外,还介绍了 TextDocument 类型,它符合 FileDocument 协议并答应从文件读取纯文本字符串,并将字符串数据导出到文件。总体而言,这篇文章强调了运用这些简略的视图修饰符可以轻松完结 SwiftUI 应用程序中的文件管理体会。

论题谈论

一群男的在找女朋友,一群女的在找男朋友,两群人互不干涉,什么原因引起的?

1、交际隔膜:交际圈子的分隔和交流机会的削减 2、忙碌生活:现代社会的快节奏和高压力导致个人时刻和精力有限 3、数字化交际:交际媒体和在线交友渠道的鼓起导致 4、个人选择规范的进步:个人对伴侣的要求变得更加严苛,导致匹配的难度添加 5、社会观念的改变:个人对爱情和婚姻的态度产生了改变,导致对寻觅爱情目标的需求削减

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

关于咱们

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

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