2016-10-03 14 views
1

Swift 2.2とiOS 9までは完全に動作していますが、Swift 3.0で変更した後は名前、電子メール、およびfbidを取得できません。結果が出て結果からデータを抽出できないためです。私のコードは[String: Any]resultオブジェクトの種類を指定し、代わりにresult["name"]などのDictionaryでの迅速な使用の添字にvalue(forKey:)setValue(_:forKey)を使用するので、このような変更を行い、迅速3.0iOSのFBGraphApiの結果からデータを抽出する方法

func signInWithFB(_ forVC:UIViewController , sucess:@escaping signInSuccessBlock , falure:@escaping SignInFailureBlock) 
     { 
      let obj_facebook = FBSDKLoginManager() 
      obj_facebook.loginBehavior = .native 
      obj_facebook.logIn(withReadPermissions: ["public_profile","email","user_friends"], from: forVC) { (result:FBSDKLoginManagerLoginResult?, error:Error?) -> Void in 
       if ((error) != nil) 
       { 
        falure(error as NSError?, false) 
       } 
       else if ((result?.isCancelled) == true) 
       { 
        falure(nil, true) 
       } 
       else 
       { 

        let dicLoginData = NSMutableDictionary() 
        let request = FBSDKGraphRequest(graphPath: "/me?fields=name,email,gender,hometown,education,location,first_name,last_name", parameters: nil) 
        let _ = 
        request?.start(completionHandler: { (Connection:FBSDKGraphRequestConnection?, result:Any!, error:Error?) -> Void in 

         if error == nil 
         { 

          dicLoginData.setValue((result as AnyObject).value(forKey: "name"), forKey: "name") 
          dicLoginData.setValue((result as AnyObject).value(forKey: "email"), forKey: "email") 
          dicLoginData.setValue((result as AnyObject).value(forKey: "gender"), forKey: "Gender") 
          dicLoginData.setValue((result as AnyObject).value(forKey: "last_name"), forKey: "lname") 
          dicLoginData.setValue((result as AnyObject).value(forKey: "first_name"), forKey: "fname") 
          let faceBookID:String = (result as AnyObject).value(forKey: "id") as! String 
          let proPicUrl = String(format:"https://graph.facebook.com/%@/picture?type=large", faceBookID) 
          dicLoginData.setValue(faceBookID, forKey: "facebookId") 
          dicLoginData.setValue(proPicUrl, forKey: "proPicURL") 
          //     dicLoginData.setValue(strLoaction?.first, forKey: "City") 


          sucess(dicLoginData) 
         } 
         else 
         { 
          falure(error as NSError?, false) 
         } 

        }) 

       } 
      } 
     } 

答えて

1

に変換した後、以下のようなものです。

if let fbDic = result as? [String: Any] { 
    dicLoginData["name"] = fbDic["name"] 
    //and so on 
} 

注:スウィフトバッターでは、あなたの代わりにNSDictionary/NSArrayのスウィフトのジェネリックDictionaryArrayオブジェクトを使用している場合。

+0

誤って編集された答えを確認してください。fbDicの代わりに 'if let'ブロック内の結果を使用しました。 –