2017-11-13 3 views
0

Ich versuche, retrieveData() aufzurufen, wenn ein Benutzer eine Schaltfläche drückt.Rufen Sie eine geschachtelte Funktion in Swift mit einer Schaltfläche

extension ViewController { 

    func doOAuthFitbit2() { 

     let oauthswift = OAuth2Swift(
      consumerKey: "*****", 
      consumerSecret: "*****", 
      authorizeUrl: "https://www.fitbit.com/oauth2/authorize", 
      accessTokenUrl: "https://api.fitbit.com/oauth2/token", 
      responseType: "code" 
     ) 

     oauthswift.accessTokenBasicAuthentification = true 
     oauthswift.authorizeURLHandler = getURLHandler() 
     let state = generateState(withLength: 20) 

     let _ = oauthswift.authorize(
      withCallbackURL: URL(string: "smart://oauth-callback")!, 
      scope: "profile nutrition", 
      state: state, 
      success: { credential, response, parameters in 
       self.retrieveData(oauthswift) 
     }, 
      failure: { error in 
       print(error.description) 
     } 
     ) 
    } 

    func retrieveData(_ oauthswift: OAuth2Swift) { 
     print("retrieveData") 
     let _ = oauthswift.client.get(
      "https://api.fitbit.com/1/user/-/profile.json", 
      parameters: [:], 
      success: { response in 
       let jsonDict = try? response.jsonObject() 
       print(jsonDict as Any) 
     }, 
      failure: { error in 
       print(error.description) 
     } 
     ) 
    } 
} 

Ich habe folgendes in ViewController.swift

@IBAction func btnRetrieveData(_ sender: Any) { 
    retrieveData(oauthswift) 
} 

ich die folgende Fehlermeldung erhalten:

Cannot convert value of type 'OAuthSwift?' to expected argument type 'OAuth2Swift'

Welche Ich gehe davon aus, weil "oauthswift" innerhalb des doOAuthFitbit2 deklariert wird() Funktion.

Muss ich den Code umgestalten, damit die Funktion retrieveData() in der Funktion doOAuthFitbit2() verschachtelt wird? Wie würde ich das in ViewController.swift nennen?

Antwort

0

Ihre oauthswift-Eigenschaft ist lokal für die doOAuthFitbit2()-Funktion, und daher können Sie nicht über die Schaltflächenmethode (oder eine andere Methode) darauf zugreifen. Ich würde vorschlagen, mit zu beginnen, können Sie es als globale Eigenschaft hinzufügen könnte, dass doOAuthFitbit2()-Updates, zB:

var oauthswift: OAuth2Swift! 
//^declare global variable 

func doOAuthFitbit2() { 

    oauthswift = OAuth2Swift(
    //^reference the global variable and set it up here 
     consumerKey: "*****", 
     consumerSecret: "*****", 
     authorizeUrl: "https://www.fitbit.com/oauth2/authorize", 
     accessTokenUrl: "https://api.fitbit.com/oauth2/token", 
     responseType: "code" 
    ) 

    oauthswift.accessTokenBasicAuthentification = true 
    oauthswift.authorizeURLHandler = getURLHandler() 
    let state = generateState(withLength: 20) 

    let _ = oauthswift.authorize(
     withCallbackURL: URL(string: "smart://oauth-callback")!, 
     scope: "profile nutrition", 
     state: state, 
     success: { credential, response, parameters in 
      self.retrieveData(oauthswift) 
    }, 
     failure: { error in 
      print(error.description) 
    } 
    ) 
} 

können Sie dann tun:

func retrieveData() { 
//    ^you don't need to pass an arg here, since it's globally accessible 
    print("retrieveData") 
    let _ = oauthswift.client.get(
     "https://api.fitbit.com/1/user/-/profile.json", 
     parameters: [:], 
     success: { response in 
      let jsonDict = try? response.jsonObject() 
      print(jsonDict as Any) 
    }, 
     failure: { error in 
      print(error.description) 
    } 
    ) 
} 

Das heißt, es sind stabiler Weisen Implementieren dieser - wie ein shared instance (singleton), auf die global in der gesamten Anwendung zugegriffen werden kann, shared delegates/protocols oder . Ich werde mich aber nicht damit beschäftigen - Sie müssten dort etwas lernen und lesen.

Verwandte Themen