Это происходит из-за SE-0213: инициализация литерала с помощью принуждения , что означает, что Optional(nil)
теперь обрабатывается как nil as Optional
компилятором. Ранее с Optional(nil)
вы получали бы упакованное значение nil
, например, Int??.some(nil)
, однако теперь вы получаете только nil
.
Так что для следующего:
let phone: Phone<Int?> = Phone.create(initial: Optional(nil))
компилятор обрабатывает его как:
let phone: Phone<Int?> = Phone.create(initial: nil as Optional)
что эквивалентно:
let phone: Phone<Int?> = Phone.create(initial: nil)
Поскольку вы указали общий параметр T
равным Int?
, параметр initial:
принимает значение Int??
. Поэтому, передавая nil
, вы передаете Int??.none
, и поэтому развертывание завершается неудачей.
Один из способов восстановить старое поведение - явно указать .init
, чтобы заставить компилятор вызывать инициализатор:
let phone: Phone<Int?> = Phone.create(initial: Optional.init(nil))
Теперь вы передаете Int??.some(nil)
параметру, и развертывание завершается успешно.
Однако я бы задал вопрос, почему вы имеете дело с дважды упакованными опциями - я настоятельно рекомендовал бы избегать их, если в этом нет крайней необходимости.