Я пытаюсь понять точные пределы перечислений с общими связанными значениями в Swift.
Вы можете подумать, что они поддерживаются, так как Optional
- такой тип. Вот код, определяющий Optional
в стандартной библиотеке Swift:
enum Optional<T> : Reflectable, NilLiteralConvertible {
case None
case Some(T)
// ...
}
Кажется, что член Some
имеет связанное значение типа переменной T
, правильно?
Однако в книге Функциональное программирование в Swift указано (стр. 87), что такие типы не поддерживаются:
Мы хотели бы определить новое перечисление, которое является общим в результат, связанный с успехом:
enum Result<T> { case Success(T) case Failure(NSError) }К сожалению, общие связанные значения не поддерживаются текущим компилятором Swift.
И действительно, если вы введете этот фрагмент в компилятор, вы получите сообщение об ошибке (error: unimplemented IR generation feature non-fixed multi-payload enum layout
).
Итак, что здесь происходит? Это просто, что он не поддерживается вообще, но поддерживается для Optional
как особый случай? Есть ли способ увидеть, как опция получает эту специальную поддержку? Или если другие стандартные типы библиотек также получают специальную поддержку?