2017-06-20 36 views
1

私の現在の機能は次のとおりです。戻り値未定義スウィフト

public func getToken() -> String { 
    Alamofire.request("url", method: .post, encoding: JSONEncoding.default) 
     .responseData { response in 
      if let data = response.data { 
       let xml = SWXMLHash.parse(data) 
       let token = ((xml["authResponse"] ["authToken"].element?.text))! 
      } 
     } 

    return token // Test is undefined down here 
} 

私はトークン文字列を返すために、この機能を取得しようとしていますが、可変tokenが定義されていません。

+0

https://stackoverflow.com/questions/27390656/how-to-return-value-from-alamofire – rmaddy

+0

また、変数の範囲について検討する必要があります。 – rmaddy

答えて

0

このコードには複数の問題があります。最初の最も明白な点は、tokenが内側クロージャ内のスコープ内にあるだけなので、returnステートメントがどこにあるかは定義されていません。ただし、2番目の問題は、Alamofireリクエストが非同期に行われることですが、getTokenメソッドのシグニチャは、結果の値が同期して提供されることを前提としています。

"コールバック"メソッドとして別のクロージャをパラメータとして受け入れるようにメソッドのシグネチャを変更することをお勧めします。これらの線に沿って何か:あなたはおそらくいくつかのより強力なエラー処理を追加したいと思います

getToken(callback: { token in 
    if let token = token { 
     print("Got the token: \(token)") 
    } else { 
     print("Didn't get the token: ¯\_(ツ)_/¯") 
    } 
}) 

、そしておそらくエラーの間で明確にする方法:

public func getToken(callback: ((String?) -> Void)) -> String { 
    Alamofire.request("url", method: .post, encoding: JSONEncoding.default) 
     .responseData { response in 
      if let data = response.data { 
       let xml = SWXMLHash.parse(data) 
       let token = ((xml["authResponse"] ["authToken"].element?.text))! 
       callback(token) 
      } else { 
       callback(nil) 
      } 
     } 
} 

その後、あなたはこのようにそれを呼び出すことができます実際のnil値が返されます(それが可能な場合でも)。また、getTokenメソッドで強制アンラッピングを取り除くことをお勧めします。うまくいけば、これはあなたの元の問題を解決します。

関連する問題