У меня есть этот код:
// empty struct for demo purpose.
struct DailyRewardItem {}
@MainActor
protocol Plugin {
var dailyRewardItems: [DailyRewardItem] { get }
}
enum MagicItemType: CaseIterable {
case shuffle
case hammer
case rocket
case bomb
@MainActor
var dailyRewardItem: DailyRewardItem {
return DailyRewardItem()
}
}
class MyPlugin: Plugin {
let dailyRewardItems = MagicItemType.allCases.map(\.dailyRewardItem)
}
Я получил это предупреждение:
Невозможно сформировать ключевой путь к основному, изолированному от актера свойству dailyRewardItem; это ошибка в языковом режиме Swift 6
Здесь MyPlugin
неявно является главным действующим лицом, поскольку он расширяет плагин. Итак, MyPlugin::dailyRewardItems
еще и главный актер. keyPath
также присутствует в роли главного героя. Не знаю, почему это дает предупреждение.
Если я не использую keyPath, он работает нормально без предупреждения.
let dailyRewardItems = MagicItemType.allCases.map { $0.dailyRewardItem }
Я использую Xcode 16 beta 3, Swift 5 с «полной» проверкой параллелизма.
Это ошибка , исправленная в этом PR, объединенном 9 июля 2024 г., то есть через день после выпуска бета-версии 3 Xcode 15. Я думаю, вы не получите это предупреждение. уже в следующей бета-версии.
Из описания пиара:
Это позволяет использовать изолированные компоненты пути ключа в инициализаторах хранимых свойств, когда само хранимое свойство изолировано от одного и того же глобального актера.
Помимо использования замыкания, инициализация свойства в init
также удаляет предупреждение в текущей версии:
init() {
dailyRewardItems = MagicItemType.allCases.map(\.dailyRewardItem)
}
@OMGPOP Код в отчете об ошибке по-прежнему выдает предупреждение? Также может быть, что версия Swift, поставляемая с Xcode, не принадлежит основной ветке. Попробуйте вытащить основную ветку и собрать ее локально. Если это по-прежнему выдает предупреждение, я бы предложил отправить еще одну проблему.
@OMGPOP На самом деле, мне кажется, я только что нашел еще одну ошибку (я использую Xcode 15.4), которая, вероятно, будет исправлена, когда это выйдет. В этом случае вы передаете путь к ключу в неотправляемое замыкание, так что все в порядке, но если вы попытаетесь передать изолированный путь к ключу главного актера в замыкание @Sendable
, он также компилируется! Это происходит только с ключевыми путями — если вместо этого вы укажете { $0.dailyRewardItem }
, компилятор правильно укажет, что это ошибка.
Я не знаю, как скомпилировать Swift и использовать его в Xcode :( но думаю, подожду бета-версии 5.
Странный. Я только что попробовал бета-версию 4, но предупреждение все еще здесь.