关闭内完成关闭

时间:2015-06-06 18:36:49

标签: swift

刚开始学习来自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);

错误消失,因此警告会产生误导。

2 个答案:

答案 0 :(得分:2)

completion将第一个参数作为User的数组,而objectsAnyObject的数组。不能保证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)