gpt4 book ai didi

arrays - 从 Swift 函数返回数组

转载 作者:行者123 更新时间:2023-11-30 13:24:19 24 4
gpt4 key购买 nike

所以我对 swift 和 object-c 也有点陌生,想知道是否有人可以帮助我。

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

在本例中,我尝试从另一个 swift 文件调用函数并返回一个数据数组。

例如,在我的 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
}

我可以确认我通过调试语句从 facebook 获取了 fbEmail 和 fbID,但正如我所说,我对如何返回数据仍然很陌生。

理想情况下,如果数组有多个值,或者能够获取像 Data.fbEmail、Data.fbID 这样的数据,或者像 ["email"这样的数组,我通常想要返回一个数组:“email@gmail.com”,“id”:“1324134124zadfa”]

当我点击 return 语句时,它是空白的.. 所以不确定为什么常量不保留值或将值传递到我的 fbData 数组中.. 例如,我正在尝试 fbData.append(fbEmail) ..

有什么想法可能是错误的吗?

最佳答案

graphConnection.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()
}
}

我添加了根据需要执行的完成处理程序和错误处理程序 block 。

现在在调用站点您可以执行以下操作:

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
})

关于arrays - 从 Swift 函数返回数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37402790/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com