Я столкнулся с проблемой 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
), почему одна версия работает, а другая - нет?