Arrays 从Swift中的函数返回数组
所以我对swift和object-c也有点陌生,我想知道是否有人能帮我一点忙 我习惯于创建一个utils文件,其中包含编程中经常使用的函数 在这种情况下,我试图从另一个swift文件调用函数并返回一个数据数组 例如,在my mainViewController.swift中,我调用函数:Arrays 从Swift中的函数返回数组,arrays,swift,Arrays,Swift,所以我对swift和object-c也有点陌生,我想知道是否有人能帮我一点忙 我习惯于创建一个utils文件,其中包含编程中经常使用的函数 在这种情况下,我试图从另一个swift文件调用函数并返回一个数据数组 例如,在my mainViewController.swift中,我调用函数: var Data = fbGraphCall() 在Utils.swift文件中,我有一个函数,我试图让它返回收集的数据数组 func fbGraphCall() -> Array<String&
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)获取错误..请参阅可能发生错误,因为我们正在使用闭包获取主队列,因此无法将未命名参数用于顶级闭包,但应将其命名。请参阅编辑。