刚开始学习来自Obj-C的Swift - 这很简单,我不理解:
class func queryForAllUsersWithCallback(completion: (users :[User]?, error :NSError?) ->()) {
var query = PFQuery(className:User.parseClassName())
query.findObjectsInBackgroundWithBlock ({
(objects:[AnyObject]?, error: NSError?) in
completion(users: objects, error: error);
})
}
给我一个编译错误:
Cannot invoke 'findObjectsInBackgroundWithBlock' with an argument list of type '(([AnyObject]?, NSError?) -> _)'
如果我注释掉这一行:
completion(users: objects, error: error);
错误消失,因此警告会产生误导。
答案 0 :(得分:2)
completion
将第一个参数作为User
的数组,而objects
是AnyObject
的数组。不能保证objects
中的内容类型正确(可能是所有编译器都知道的各种类型的杂色集合),因此无法编译。
如果你进行条件转换,它应该编译,即:
completion(users: objects as? [User], error: error)
注意,这将在运行时检查objects
中的每个元素是否都是正确的类型。如果它们中没有任何一个,则传递给完成处理程序时整个数组将为nil
。这将编译,因为参数是可选的,但可能非常令人惊讶/失败无声甚至更糟,崩溃因为completion
内的某处可能是不 nil的假设,所以它可能会被强行打开。
因此,您可能希望在以下内容中进行一些错误处理:
if let users = objects as? [User] {
completion(users: users, error: error)
}
else {
// log or fatalError or something
}
(如果上面的某些语法不太正确,我很抱歉,我没有测试过代码,因为你的代码片段不可复制/独立)
答案 1 :(得分:0)
您只需将对象强制转换为User:
completion(users: objects as? [User], error: error)