从函数返回数据(Swift)

我想返回结果,并能够从这个函数访问结果数组。 一切都在这个函数中工作,但是我不能返回任何东西,也不能从闭包外部访问函数内部创build的结果或variables。 我想从闭包外部访问result.valueForKey(“id”)。 我怎样才能做到这一点?

class ViewController: UIViewController, FBSDKLoginButtonDelegate { var facebookid: NSString = "" var username: NSString = "" var userEmail:NSString = "" override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. if (FBSDKAccessToken.currentAccessToken() == nil) { let loginView : FBSDKLoginButton = FBSDKLoginButton() self.view.addSubview(loginView) loginView.center = self.view.center loginView.readPermissions = ["public_profile"] loginView.delegate = self } else { returnUserData() println(facebookid) // This doesn't work } } func returnUserData() { let graphRequest : FBSDKGraphRequest = FBSDKGraphRequest(graphPath: "me", parameters: nil) graphRequest.startWithCompletionHandler({ (connection, result, error) -> Void in if ((error) != nil) { // Process error println("Error: \(error)") } else { self.facebookid = result.valueForKey("id") as NSString! self.username = result.valueForKey("name") as NSString! self.userEmail = result.valueForKey("email") as NSString! println(result) // This works } }) } 

编辑:我没有根据下面的2个答案更改代码,但仍然无法获得viewDidLoadclosures任何数据返回。 * println(facebookid)在ViewDidLoad中不返回任何东西,而在函数中的闭包内部。

你在闭包里面创buildvariables,这意味着它们只能在里面访问。

您需要在课程顶部的函数之外创buildvariables。

例如

  class YourClassName { var facebookid var username var userEmail func returnUserData() { let graphRequest : FBSDKGraphRequest = FBSDKGraphRequest(graphPath: "me", parameters: nil) graphRequest.startWithCompletionHandler({ (connection, result, error) -> Void in if ((error) != nil) { // Process error println("Error: \(error)") } else { self.facebookid = result.valueForKey("id") as? String self.userName = result.valueForKey("name") as? String self.userEmail = result.valueForKey("email") as? String } }) } } 
 func loginButton(_ loginButton: FBSDKLoginButton!, didCompleteWith result: FBSDKLoginManagerLoginResult!, error: Error!) { if error != nil { print(error.localizedDescription) return } print("user loged in with facebook") if((FBSDKAccessToken.current()) != nil) { FBSDKGraphRequest(graphPath: "me", parameters: ["fields": "id, name, first_name, last_name, email, age_range, link, gender, locale, timezone, updated_time, verified"]).start(completionHandler: { (connection, result, error) -> Void in if (error == nil){ print(result!) print("Token: \((FBSDKAccessToken.current().tokenString)!)") print("Token Expiration Date: \((FBSDKAccessToken.current().expirationDate)!)") } }) } }