@NONAME8

Почему происходит ошибка разворачивания инициализированного опционала,?

Почему происходит ошибка разворачивания инициализированного опционала,?

Я же инициализировал опциональную переменную в ходе работы метода, топа почему у меня ошибка?
func aaa()->Bool{
        var per2:Bool?
        do {
            let fetchResult = try PersistenceService.contex.fetch(fetchRequest)
            
            for item in fetchResult {
                
                let per = item.password
                if per == nil{
                    print("пароль еще не создан")
                    per2 = false

                }

                else{
                    print("пароль \(per!)")
                    per2 = true
                }

                
            }
        } catch{
            print(error.localizedDescription)
        }
        
        return (per2)!
    }
  • Вопрос задан
  • 68 просмотров
Решения вопроса 1
maestrro712
@maestrro712
 iOS Developer
Я вижу 2 случая, когда переменная не инициализируется:

1. `fetch` произошел с ошибкой. Ошибка поймалась в `catch`, исполнение счастливо пошло дальше, но `per2` так и осталась не инициализированной
2. массив `fetchResult` - пустой, тогда тело цикла не выполнится ни разу
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
А зачем вам здесь вообще Bool? понадобился?
Если флаг успеха, то лучше var per2 = false.
Ещё, у вас есть блок try-catch, но в нём ни одного try.
Ещё, вы выводите не-развёрнутый Optional, о чём, к счастью, предупредит компилятор.
Кроме того, у вас может произойти отказ в разных местах, так что стоит подумать над использованием ошибок / "исключений" Swift:

func aaa() throws {
            let fetchResult = try PersistenceService.contex.fetch(fetchRequest)

            for item in fetchResult {
                let per = item.password
                guard let pass = per else {
                    throw AaaErrors.passwordNotCreated
                }
                print("пароль \(pass!)")
            }
    }
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы