Почему меняется значение переменной?


#1

Почему меняется значение переменной?
Почему значение Result = -1 возвращает print(“Result2 =” + “(Result)”); даже если print(“Result2 =” + “(Result)”); вывел 0?
Как может между этими двумя строчками поменяться значение Result?

var Result : Int;
Result = -1

    ...    
        do {
            let json = try JSONSerialization.jsonObject(with: data, options: [])
            
            
            let ReturnParams = try JSONDecoder().decode(OutParams.self, from: data)
            print(ReturnParams)
            print("code =" + "\(ReturnParams.code!)");
            print("message =" + "\(ReturnParams.message!)");
            Result = ReturnParams.code!
            print("Result1 =" + "\(Result)");
            
            if (Result == 0)
            {
                print("passwordHash =" + "\(ReturnParams.passwordHash!)");
                print("type =" + "\(ReturnParams.type!)");
                self.LastErrorMessage = ""
            }
            else
            {
                self.LastErrorMessage = ReturnParams.message!
                self.LastErrorCode = Result
            }
            
        } catch {
            
            print(error)
        }
        }.resume()

   
    print("Result2 =" + "\(Result)");
   //Почему здесь значение -1? даже если Print Result 1 вывел другое значение?
    
    return Result

#2

Потому что сначала выводится:
print(“Result2 =” + “(Result)”); // =-1

а потом уже измененный Result:
print(“Result1 =” + “(Result)”);


#3

Почитай про многопоточность


#4

И return Result нужно сделать в блоке do
А вообще здесь скорее всего надо использовать замыкание. Если у Вас нет никакой логики на смену значения Result (наблюдателя) или { didSet {} }


#5

Владимир, спасибо большое. Не понимал, что здесь отдельный поток.
А если я возвращаю return Result внутри блока do как вы советуете, то получаю ошибку Unexepected non-void return value in void function. Вне блока do нет этой ошибки. Подскажите как правильно оформить данный код, чтобы корректно вернуть Result?


#6

Как правильно обработать результаты завершения потока, тогда, когда поток завершен?


#7
    func helpMe(completion: @escaping (_ result: Int) -> Void) {

    var Result : Int
    Result = -1
    
    let task = URLSession.shared.dataTask(with: URL(string: "")!) { (data, _, _) in
        
        guard let data = data else { return }
        
        do {
            let json = try JSONSerialization.jsonObject(with: data, options: [])
            
            
            let ReturnParams = try JSONDecoder().decode(OutParams.self, from: data)
            print(ReturnParams)
            print("code =" + "\(ReturnParams.code!)");
            print("message =" + "\(ReturnParams.message!)");
            Result = ReturnParams.code!
            print("Result1 =" + "\(Result)");
            
            
            /*   ЭТО Я ДУМАЮ НУЖНО ВЫНЕСТИ ИЗ ЭТОГО МЕТОДА В ЕГО ВЫЗОВ  ->
            if (Result == 0)
            {
                print("passwordHash =" + "\(ReturnParams.passwordHash!)");
                print("type =" + "\(ReturnParams.type!)");
                self.LastErrorMessage = ""
            }
            else
            {
                self.LastErrorMessage = ReturnParams.message!
                self.LastErrorCode = Result
            }
            */
            
            completion(Result)
            
        } catch {
            
            print(error)
        }
    }.resume()
    
    
    print("Result2 =" + "\(Result)");
    //Почему здесь значение -1? даже если Print Result 1 вывел другое значение?
}
//     return Result

и теперь использование:

helpMe { (newResult) in
        print(newResult)
        
        // ->   СЮДА
    }

#8

а вообще изучи теорию лучше.

И еще имена переменных пишутся с маленькой буквы


#9

Владимир, извиняюсь, что с такой паузой.

А что такое

completion(Result)

#10

Передача Result в замыкание func helpMe(completion: @escaping (_ result: Int) -> Void) наверх для использования:

helpMe { (newResult) in
        print(newResult)
        
        // ->   СЮДА
    }