(Swift) - 如何获取函数内部的变量值

时间:2017-01-27 16:26:59

标签: swift

我必须在我的项目中提交文件,1 - view.swift和2 - login.swift。 我在login.swift中有一个函数,它将从我提供的站点获取一个令牌。然后我需要我的函数从网站获取的令牌,我想在我的view.swift中使用它,但无论我做什么,我都无法在函数之外得到它。

代码是这样的:

 struct universal{
 static var token = String()
 static var passkey = String()
 }
 class LoginManager {

 let loginURL = "http://somesite.com"

 func login() {
    let parameters: Parameters = [
        "username": "username",
        "password": "password",
        "device": "gtv",
        "redir": "0"
    ]

    Alamofire.request(loginURL, method: .get, parameters: parameters).responseJSON { (response) in

        let jsonRes = JSON(data: response.data!)
        var token = jsonRes["token"].stringValue
        // the value of universal.token is not print outside of this func nither the token. But both of them can get the value here and when printing them it shows the value
        universal.token = jsonRes["token"].stringValue
   }



   }

我是新手,所以不要吝啬。我只是想学习。

问题是我怎样才能获得唯一的价值,不仅仅是关闭,或者如果可能的话,在其他类中使用整个函数

3 个答案:

答案 0 :(得分:0)

您当前的请求是异步的,这意味着您需要为该函数提供一个可在请求完成后执行的代码块。

您可以将您的令牌传递给此区块并随意执行任何操作。

请查看this帖子以获取更多信息和一些代码,了解如何实现此目的。

答案 1 :(得分:0)

编辑:使用UserDefaults可以处理像令牌之类的东西,但是您应该知道如何协调来自API调用的数据,这是iOS编程的基础。

此代码看起来很好。在异步Alamofire调用返回之前,您可能正在检查令牌。

class ViewControllerThatNeedsToken : UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        if Universal.token != "" {
            //There's a token already...
            self.doSomething(with: universal.token)
        } else {
            //Handle not having a token yet
        }
    }

    func doSomething(with token: String) {
         //do something 
    }
}

然后在您的API调用中:

    let referenceToNeedsToken : ViewControllerThatNeedsToken = //...get reference 

    Alamofire.request(loginURL, method: .get, parameters: parameters).responseJSON { [weak referenceToNeedsToken] (response) in

        let jsonRes = JSON(data: response.data!)
        var token = jsonRes["token"].stringValue
        // the value of universal.token is not print outside of this func nither the token. But both of them can get the value here and when printing them it shows the value
        Universal.token = jsonRes["token"].stringValue
        referenceToNeedsToken?.doSomething(with: Universal.token)
   }

请注意,在放置引用时,需要将[weak referenceToNeedsToken]放在闭包中。然后使用可选链接referenceToNeedsToken?.doSomething(with: Universal.token),因为如果视图控制器不存在,您可能不想再做任何事情了。

另请注意,struct名称应为大写,因为它是一种类型。希望这可以帮助。

答案 2 :(得分:0)

我认为您希望获得Alamofire区块之外的价值,并且您可以在Alamofire'之外打印。阻止。

<强>解决方案:  下面我编辑了您的编码内容,尝试实现它。在这里,我将向您展示如何在Alamofire块之外访问您的令牌值,您可以根据您的要求进一步实现它。

     struct universal
     {
         static var token = String()
         static var passkey = String() 
     }

     class LoginManager 
    {

     let loginURL = "http://somesite.com"

     func login()
     {
        let parameters: Parameters = [
            "username": "username",
            "password": "password",
            "device": "gtv",
            "redir": "0"
        ]

        Alamofire.request(loginURL, method: .get, parameters: parameters).responseJSON { (response) in

            let jsonRes = JSON(data: response.data!)
            var token = jsonRes["token"].stringValue

            self.myFunction(str: token)

            universal.token = jsonRes["token"].stringValue

       }
   }
   func myFunction(str: String)
    {
         print("str value ====%@",str)
         //Here it will print value of your token.
     }
}

解决方案2:

我在这里使用NSUserDefault,了解更多关于它的信息,谷歌可以提供多个例子。

现在,我们将使用NSUserDefault。

//Use below code in alamofire block to save token value.

    let defaults = UserDefaults.standard
    defaults.set(token, forKey: "tokenValue")

//Use below code to print anywhere.

    let defaults = UserDefaults.standard
    if let myToken = defaults.value(forKey: "tokenValue") as? String {
        print("defaults savedToken: \(myToken)")
    }

希望它对你有所帮助。