Swift 将Alamofire请求数据保存到变量中

Swift 将Alamofire请求数据保存到变量中,swift,request,alamofire,Swift,Request,Alamofire,我在通过Alamofire从VM服务器获取密码时遇到问题。我正在向服务器发出请求,它应该会将salt返回给我,这样我就可以对我的密码进行salt操作,将其散列并发送回服务器 问题是我不知道如何将Alamofire接收到的salt保存到一个变量中,所以我可以将它添加到password中,然后像这样散列: let salted_password = user_password + salt let hash = salted_password.sha1() 其中,user\u password是用

我在通过Alamofire从VM服务器获取密码时遇到问题。我正在向服务器发出请求,它应该会将salt返回给我,这样我就可以对我的密码进行salt操作,将其散列并发送回服务器

问题是我不知道如何将Alamofire接收到的salt保存到一个变量中,所以我可以将它添加到password中,然后像这样散列:

let salted_password = user_password + salt
let hash = salted_password.sha1()
其中,
user\u password
是用户在密码字段中输入的内容,
salt
是我从Alamofire salt请求中获得的内容

这是我的密码:

func getSalt(completionHandler: @escaping (DataResponse<String>, Error?) -> Void) {

        Alamofire.request("http://192.168.0.201/salt", method: .post, parameters: salt_parameters).responseString { response in

        switch response.result {
        case .success(let value):
            completionHandler(response as DataResponse<String>, nil)
        case .failure(let error):
            completionHandler("Failure", error)
            }
        }
    }

    let salt = getSalt { response, responseError in

        return response.result.value!
    }
那么,是否可以将请求值保存到变量中?我该怎么办


感谢您的关注。

这里的问题是因为您如何实现了
完成块

例如:

func someAsynchronousCall(a: Int, b: Int, @escaping block: (_ result: Int) -> Void) {
    ... some code here
    ... { 
        // let's just say some async call was done and this code is called after the call was done
        block(a + b)
    }
}
要使用此代码,它将如下所示:

var answer: Int = 0
someAsynchronousCall(100, b: 200) { result in // the `result` is like what you're returning to the user since API calls need to be called asynchronously you do it like this rather than creating a function that has a default return type.
    answer = result
    print(answer)
}
print(answer)
这张照片看起来像这样

0
300
var salt: String?
getSalt { response, responseError in 
    salt = response.result.value 
}
由于我们将answer声明为
0
它首先打印了它,因为异步调用还没有完成,所以在异步调用完成之后(通常是几毫秒之后),它接着打印
300

所以你的代码应该是这样的

0
300
var salt: String?
getSalt { response, responseError in 
    salt = response.result.value 
}

这里的问题是因为您如何实现
完成块

例如:

func someAsynchronousCall(a: Int, b: Int, @escaping block: (_ result: Int) -> Void) {
    ... some code here
    ... { 
        // let's just say some async call was done and this code is called after the call was done
        block(a + b)
    }
}
要使用此代码,它将如下所示:

var answer: Int = 0
someAsynchronousCall(100, b: 200) { result in // the `result` is like what you're returning to the user since API calls need to be called asynchronously you do it like this rather than creating a function that has a default return type.
    answer = result
    print(answer)
}
print(answer)
这张照片看起来像这样

0
300
var salt: String?
getSalt { response, responseError in 
    salt = response.result.value 
}
由于我们将answer声明为
0
它首先打印了它,因为异步调用还没有完成,所以在异步调用完成之后(通常是几毫秒之后),它接着打印
300

所以你的代码应该是这样的

0
300
var salt: String?
getSalt { response, responseError in 
    salt = response.result.value 
}

getSalt()
的返回值是多少?似乎您正试图将一个
字符串
与该函数的结果结合起来,但您不能(正如您已经发现的困难:)您应该这样做<代码>变量盐:字符串?;getSalt{response,responseError in salt=response.result.value;}
@ZonilyJame非常感谢,它很有效@我会添加一个答案,你能接受吗:)如果有帮助,也请投票给评论。
getSalt()
的返回值是多少?似乎您正试图将一个
字符串
与该函数的结果结合起来,但您不能(正如您已经发现的困难:)您应该这样做<代码>变量盐:字符串?;getSalt{response,responseError in salt=response.result.value;}@ZonilyJame非常感谢,它很有效@我会补充一个答案,你能接受吗:)如果评论有帮助,也请投票。