Swift: компилятор выдает странную ошибку при использовании дженериков и оболочки свойств - PullRequest
0 голосов
/ 09 июля 2020

Я столкнулся с проблемой Swift, которую я не совсем понимаю.

Рассмотрите этот код (вы можете вставить его в игровую площадку):

import UIKit

protocol Selectable: Equatable {
  var label: String { get }
}

enum Gender: String, CaseIterable, Equatable, Selectable {
  case male
  case female

  var label: String {
    return rawValue.capitalized
  }
}

protocol Delegate: class {
  func openSelectionScreen<Option: Selectable>(title: String, options: [Option], selectedOption: Option?, selectionChanged: @escaping (Option) -> Void)
}

class Test {
  weak var delegate: Delegate?
  @Published var selectedGender = Gender.male

  init() {
    delegate?.openSelectionScreen(title: "Gender", options: Gender.allCases, selectedOption: selectedGender) { option in
      self.selectedGender = option
    }
  }
}

Это дает компилятор ошибка Cannot assign value of type '_' to type 'Gender'. Этого не происходит, когда я удаляю оболочку @Published из переменной selectedGender. И ошибка также исчезнет, ​​если я сделаю это:

delegate?.openSelectionScreen(title: "Gender", options: Gender.allCases, selectedOption: selectedGender.self) { option in
  self.selectedGender = option
}

Обратите внимание на использование .self после selectedGender.

Итак, у меня есть обходной путь, код работает, как ожидалось . Но .. почему это происходит? И поскольку selectedGender и selectedGender.self имеют один и тот же тип (Gender), почему одна версия работает, а другая - нет?

1 Ответ

0 голосов
/ 09 июля 2020

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

@Publisher аннотация является root причиной в этом случае. В вызове функции он не распознает selectedGender имеет тип Gender.

Вы можете исправить это, выполнив приведение типа:

delegate?.openSelectionScreen(title: "Gender", options: Gender.allCases, selectedOption: selectedGender as Gender?) { option in
      self.selectedGender = option
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...