Arrays 从Swift中的函数返回数组

Arrays 从Swift中的函数返回数组,arrays,swift,Arrays,Swift,所以我对swift和object-c也有点陌生,我想知道是否有人能帮我一点忙 我习惯于创建一个utils文件,其中包含编程中经常使用的函数 在这种情况下,我试图从另一个swift文件调用函数并返回一个数据数组 例如,在my mainViewController.swift中,我调用函数: var Data = fbGraphCall() 在Utils.swift文件中,我有一个函数,我试图让它返回收集的数据数组 func fbGraphCall() -> Array<String&

所以我对swift和object-c也有点陌生,我想知道是否有人能帮我一点忙

我习惯于创建一个utils文件,其中包含编程中经常使用的函数

在这种情况下,我试图从另一个swift文件调用函数并返回一个数据数组

例如,在my mainViewController.swift中,我调用函数:

var Data = fbGraphCall()
在Utils.swift文件中,我有一个函数,我试图让它返回收集的数据数组

func fbGraphCall() -> Array<String>{

var fbData: [String] = [""]

if (FBSDKAccessToken.currentAccessToken() != nil){

    // get fb info
    var userProfileRequestParams = [ "fields" : "id, name, email, about, age_range, address, gender, timezone"]

    let userProfileRequest = FBSDKGraphRequest(graphPath: "me", parameters: userProfileRequestParams)

    let graphConnection = FBSDKGraphRequestConnection()

    graphConnection.addRequest(userProfileRequest, completionHandler: { (connection: FBSDKGraphRequestConnection!, result: AnyObject!, error: NSError!) -> Void in
        if(error != nil) {

            println(error)

        } else {

            // DEBUG
            println(result)


            let fbEmail = result.objectForKey("email") as! String

            // DEBUG
            println(fbEmail)

            fbData.append("\(fbEmail)")

            let fbID = result.objectForKey("id") as! String


            if(fbEmail != "") {
                PFUser.currentUser()?.username = fbEmail
                PFUser.currentUser()?.saveEventually(nil)
            }

            println("Email: \(fbEmail)")

            println("FBUserId: \(fbID)")


        }


    })

    graphConnection.start()
}

println(fbData)
return fbData
}
func fbGraphCall()->数组{
变量fbData:[字符串]=[“”]
如果(FBSDKAccessToken.currentAccessToken()!=nil){
//获取fb信息
var userProfileRequestParams=[“字段”:“id、姓名、电子邮件、关于、年龄范围、地址、性别、时区”]
让userProfileRequest=FBSDKGraphRequest(graphPath:“我”,参数:userProfileRequestParams)
设graphConnection=FBSDKGraphRequestConnection()
addRequest(userProfileRequest,completionHandler:{(连接:FBSDKGraphRequestConnection!,结果:AnyObject!,错误:NSError!)->中的Void
如果(错误!=nil){
println(错误)
}否则{
//调试
println(结果)
将fbEmail=result.objectForKey(“email”)设为!字符串
//调试
println(FBE电子邮件)
fbData.append(“\(fbeail)”)
将fbID=result.objectForKey(“id”)设为!字符串
如果(fbEmail!=“”){
PFUser.currentUser()?.username=fbEmail
PFUser.currentUser()?.savefinally(nil)
}
println(“电子邮件:\(fbEmail)”)
println(“FBUserId:\(fbID)”)
}
})
graphConnection.start()的
}
println(fbData)
返回fbData
}
我可以用我的调试语句确认我从facebook收到了FBE电子邮件和fbID,但正如我所说的,我对如何返回数据仍然是新手

理想情况下,我通常希望返回一个数组,如果它有多个值,或者能够返回数据,如
data.fbeail、data.fbID
,或者一个数组,如
[“email”:email@gmail.com,“id”:“1324134124zadfa”]

当我点击返回语句时,它是空的。。因此,我不知道为什么常量没有保留值或将值传递到我的fbData数组中。。我正在尝试fbData.append(fbEmail)例如


有什么想法吗?

图形连接.addRequest是一个异步函数,您正在尝试同步返回字符串数组。这将不起作用,因为
graphConnection.addRequest
是在后台完成的,以避免阻塞主线程。因此,与其直接返回数据,不如创建一个完成处理程序。然后,您的功能将变为:

func fbGraphCall(completion: ([String]) -> Void, errorHandler errorHandler: ((NSError) -> Void)?) {
    if (FBSDKAccessToken.currentAccessToken() != nil) {
        // get fb info
        var userProfileRequestParams = [ "fields" : "id, name, email, about, age_range, address, gender, timezone"]

        let userProfileRequest = FBSDKGraphRequest(graphPath: "me", parameters: userProfileRequestParams)

        let graphConnection = FBSDKGraphRequestConnection()

        graphConnection.addRequest(userProfileRequest, completionHandler: { (connection: FBSDKGraphRequestConnection!, result: AnyObject!, error: NSError!) -> Void in
            if(error != nil) {
                println(error)
                errorHandler?(error!)
            } else {
                var fbData = [String]() // Notice how I removed the empty string you were putting in here.
                // DEBUG
                println(result)


                let fbEmail = result.objectForKey("email") as! String

                // DEBUG
                println(fbEmail)

                fbData.append("\(fbEmail)")

                let fbID = result.objectForKey("id") as! String


                if(fbEmail != "") {
                    PFUser.currentUser()?.username = fbEmail
                    PFUser.currentUser()?.saveEventually(nil)
                }

                println("Email: \(fbEmail)")

                println("FBUserId: \(fbID)")

                completion(fbData)
            }


        })

        graphConnection.start()
    }
}
我添加了根据需要执行的完成处理程序和错误处理程序块

现在,在呼叫站点,您可以执行以下操作:

fbGraphCall( { println($0) // $0 refers to the array of Strings retrieved }, errorHandler:  { println($0) // TODO: Error handling  }) // Optionally you can pass `nil` for the error block too incase you don't want to do any error handling but this is not recommended.
编辑

为了使用变量,您可以在调用站点执行类似的操作

 fbGraphCall( { array in
      dispatch_async(dispatch_get_main_queue(), {  // Get the main queue because UI updates must always happen on the main queue.
             self.fbIDLabel.text = array.first // array is the array we received from the function so make sure you check the bounds and use the right index to get the right values.
             self.fbEmailLabel.text = array.last 
      })
 }, errorHandler:  { 
        println($0) 
        // TODO: Error handling  
  })

你想返回一个字符串数组吗?谢谢,我仍在尝试消化它,但事实上,现在对我来说是异步的,并且是非阻塞的。xcode 6.4指出的一点是,它希望将函数行更改为
func fbGraphCall(completion:([String])->Void,#errorHandler:((NSError)->Void)?){
哦,是的,我忘了你还在使用Swift 1.2,我已经习惯了Swift 2中的#语法不再起作用。事实上,在Swift 2中,你不需要放置#或额外的errorHandler,因为全局函数与类上的方法有类似的命名约定。但现在你应该将其更改为Xcode 6.4建议的格式。对不起在这件事上,我是个彻头彻尾的傻瓜。但我不确定如何将返回的数据分配给变量,我可以使用这些变量。类似于
var data=fbGraphCall({$0},errorHandler:{$0})
。现在返回了两件事fbeail和fbid。我需要如何获取这些数据,然后才能将它们添加到fbilabel.text=(返回的数据),fbeaillable.text=(data.returned)获取错误..请参阅可能发生错误,因为我们正在使用闭包获取主队列,因此无法将未命名参数用于顶级闭包,但应将其命名。请参阅编辑。