Ответ
Непосредственно складывать опционалы оператором + нельзя, так как Optional — это перечисление (Optional<Wrapped>). Для сложения значений необходимо сначала извлечь (unwrap) содержимое, обрабатывая случай nil.
Основные подходы:
-
Optional Binding (
if let/guard let):let a: Int? = 5 let b: Int? = 3 var sum: Int? if let unwrappedA = a, let unwrappedB = b { sum = unwrappedA + unwrappedB // sum == Optional(8) } // sum останется nil, если a ИЛИ b равны nil -
Nil-Coalescing Operator (
??):let a: Int? = 5 let b: Int? = nil let sum = (a ?? 0) + (b ?? 0) // sum == 5 // Предоставляет значения по умолчанию на случай nil. -
Функциональные преобразования (
map/flatMap):let a: Int? = 5 let b: Int? = 3 // flatMap используется, когда преобразование само возвращает опционал. let sum = a.flatMap { aValue in b.map { bValue in aValue + bValue } } // sum == Optional(8) // Результат — Optional<Int>. Будет nil, если любой из операндов — nil.
Рекомендация: Выбор метода зависит от требуемого поведения при nil. Для явной и безопасной обработки используйте optional binding. Для задания значений по умолчанию — оператор ??.