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

swift

#1

Почему происходит ошибка разворачивания инициализированного опционала?
fatal error: unexpectedly found nil while unwrapping an Optional value

Я же инициализировал опциональную переменную в ходе работы метода, тогда почему у меня ошибка?

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("пароль еще не создан")
            if per2 == nil{
                per2 = false
            }
          

        }

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

        
    }
} catch{
    print(error.localizedDescription)
}

return (per2)! // ошибка тут
}

#2

Потому как переменная не была инициализирована, то есть по сути содержит nil. У вас блок if, так вот тудв не производился вход и переменная так и не создалась.

Не проще в таком случае сделать так?

var per2 = false


#3

Как я понял, у меня не происходит вход в блок if, потому что не срабатывает fetchResult , поэтому и цикл по пустому fetchResult произойти не может. Тогда я не пойму почему у меня не срабатывает *fetchResult, если такая же реализация работала для viewDidLoad?

Мне просто нужно было вынести эту реализацию в другой метод, чтобы я мог вернуть значения , в зависимости от условий.


#4

Так вы в отладчике по шагам пройдите весь метод и разберитесь, почему вход не производится


#5

Не храните пароли в базе данных, используйте для этого кейчейн.


#6

Та у меня шагов толком нет. Я запускаю этот метод в AppDelegate и сравниваю ее с условием. А в самом методе ошибка выскакивает после цикла.

Тут код:
https://drive.google.com/open?id=1jqoHA8iY1l9yzktAHsB8-CVogtltTHNs

Мне теперь кажется, что то как я хотел это сделать в принципе невозможно.
Я хотел в AppDelegate didFinishLaunchingWithOptions вызвать метод, который в зависимости от наличия значения в CoreData вернет true/false, а потом в didFinishLaunchingWithOptions я бы инициализировал входной ViewController. Но теперь мне кажется, что это невозможно, поскольку я не смогу никак вызвать fetchedResults, потому что метод AppDelagate applicationWillTerminate не вызовется, СoreData не создаться и я соответсвенно не смогу сделать fetch.


#7

Вы имеете ввиду UserDefaults?


#8

Нет, Keychain


#9

А насчет этого я правильно думаю или нет?

Та у меня шагов толком нет. Я запускаю этот метод в AppDelegate и сравниваю ее с условием. А в самом методе ошибка выскакивает после цикла.

Тут код:https://drive.google.com/open?id=1jqoHA8iY1l9yzktAHsB8-CVogtltTHNs

Мне теперь кажется, что то как я хотел это сделать в принципе невозможно.Я хотел в AppDelegate didFinishLaunchingWithOptions вызвать метод, который в зависимости от наличия значения в CoreData вернет true/false, а потом в didFinishLaunchingWithOptions я бы инициализировал входной ViewController. Но теперь мне кажется, что это невозможно, поскольку я не смогу никак вызвать fetchedResults, потому что метод AppDelagate applicationWillTerminate не вызовется, СoreData не создаться и я соответсвенно не смогу сделать fetch.
[/quote]


#10

А зачем вы хотите это сделать? это типа проверка на вход в систему?


#11

Типа того. В зависимости от наличия пароль открыть соответствующее окно. Если пароль есть, то открыть окно “Ввода пароля”, если пароля нет, то окно “Cоздания пароля”


#12

Передал все по той же логике, но используя KeyChain и все заработало)
Единственное, что не нравиться в их использование, это что даже после удаление программы и повторном создании, приложение загружается сразу с паролем.