Xcode中的“可接近的并发性”与“默认非隔离(nonsending)”以及“默认Actor隔离”设置之间的冲突
基于 这篇文章,"可接近的并发"意味着默认使用main actor,并默认使用nonisolated(nonsending)。然而,在Xcode中,已经同时存在“默认actor隔离”设置和“默认非隔离by default”设置。
这真的很混乱——如果我开启了“可接近的并发”,但禁用“默认非隔离by default”,并且把默认actor隔离设为nonisolated,会怎样?
换句话说,设置“可接近的并发”有什么意义?它会与另外两个设置发生冲突吗?
解决方案
Xcode自己会告诉你:
- 可接近的并发 "启用旨在提供更易于接近的Swift并发路径的即将到来的特性:DisableOutwardActorInference、GlobalActorIsolatedTypesUsability、InferIsolatedConformances、InferSendableFromCaptures,以及NonisolatedNonsendingByDefault"。你可以在Swift Compiler - Upcoming Features下查看这些设置。
确实,当你开启或关闭可接近的并发时,你可以看到这些设置在Swift Compiler - Upcoming Features下随之开启或关闭。 - 默认actor隔离 "控制未标注代码的默认actor隔离。当设置为 'MainActor' 时,@MainActor的隔离将默认被推断出来,以减少顺序代码中的假阳性数据竞争错误。"
这与前面段落所列的任何特性无关(彼此独立)。
前进的最佳做法,然而,是将Swift Language Version设置为Swift 6,将Approachable Concurrency设为YES,并将Default Actor Isolation设为MainActor。前者会把Strict Concurrency Checking切换为Complete,并开启一些与Approachable Concurrency相同的设置。你现在已经进入现代世界。
但要禁用 "nonisolated(nonsending) by default",并把默认actor隔离设为nonisolated
嗯,别这么做。你为什么要这么做呢?但如果你真的这么做,你的设置会被执行。换句话说,“可接近的并发”(以及SWift 6)会把某些设置切换为YES,但你也可以把它们切换回NO。幕后并不存在所谓的“冲突”;场景,正如眼前所见,就是你看到的样子。