Странная ошибка: «Невозможно сформировать ключевой путь к основному свойству, изолированному актером…» в параллелизме Swift

У меня есть этот код:

// 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 с «полной» проверкой параллелизма.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
68
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это ошибка , исправленная в этом PR, объединенном 9 июля 2024 г., то есть через день после выпуска бета-версии 3 Xcode 15. Я думаю, вы не получите это предупреждение. уже в следующей бета-версии.

Из описания пиара:

Это позволяет использовать изолированные компоненты пути ключа в инициализаторах хранимых свойств, когда само хранимое свойство изолировано от одного и того же глобального актера.


Помимо использования замыкания, инициализация свойства в init также удаляет предупреждение в текущей версии:

init() {
    dailyRewardItems = MagicItemType.allCases.map(\.dailyRewardItem)
}

Странный. Я только что попробовал бета-версию 4, но предупреждение все еще здесь.

OMGPOP 24.07.2024 05:37

@OMGPOP Код в отчете об ошибке по-прежнему выдает предупреждение? Также может быть, что версия Swift, поставляемая с Xcode, не принадлежит основной ветке. Попробуйте вытащить основную ветку и собрать ее локально. Если это по-прежнему выдает предупреждение, я бы предложил отправить еще одну проблему.

Sweeper 24.07.2024 05:44

@OMGPOP На самом деле, мне кажется, я только что нашел еще одну ошибку (я использую Xcode 15.4), которая, вероятно, будет исправлена, когда это выйдет. В этом случае вы передаете путь к ключу в неотправляемое замыкание, так что все в порядке, но если вы попытаетесь передать изолированный путь к ключу главного актера в замыкание @Sendable, он также компилируется! Это происходит только с ключевыми путями — если вместо этого вы укажете { $0.dailyRewardItem }, компилятор правильно укажет, что это ошибка.

Sweeper 24.07.2024 06:16

Я не знаю, как скомпилировать Swift и использовать его в Xcode :( но думаю, подожду бета-версии 5.

OMGPOP 27.07.2024 17:34

Другие вопросы по теме

Похожие вопросы