尝试 return 函数中的数组时收到未解析的标识符

unresolved identifier received when trying to return an array in function

我收到一个错误:“在尝试 return 数据数组时使用了未解析的标识符 'data'。我的代码列在下面。有人可以告诉我为什么会这样吗?

    public func loadData()->[Q] {
    let publicData = CKContainer.default().publicCloudDatabase
    let pred = NSPredicate(value: true)
    let query = CKQuery(recordType: "question", predicate: pred)
    publicData.perform(query, inZoneWith: nil, completionHandler: ({results, error in
        if(error != nil) {
            print(error?.localizedDescription)
        } else {
            if results!.count > 0 {
                var data = [Q]()
                for result in results!{
                    let quest = result.object(forKey: "question_name") as! String!
                    let a = result.object(forKey: "a") as! String!
                    let b = result.object(forKey: "b") as! String!
                    let c = result.object(forKey: "c") as! String!
                    let d = result.object(forKey: "d") as! String!
                    let answer = result.object(forKey: "answer") as! String!
                    let category = result.object(forKey: "category") as! String!
                    let final = Q(quest: quest!, A:a!, B: b!, C: c!, D: d!, answer: answer!, category: category!)
                    data.append(final)
                }
            }
        }
    }))
    return data
}

不!不!不!,永远不会使用sleep解决异步任务!太可怕了。

  • 为方便起见,使用 successfailure 个案例和关联类型创建枚举

    enum Result {
      case success([Q]), failure(Error)
    }
    
  • loadDatareturndataerror中完成处理程序。我删除了一堆多余的括号、感叹号和数组的空检查。在没有错误且没有匹配数据的情况下,Q 的空数组被 returned.

    public func loadData(completion: @escaping (Result)->() ) {
      let publicData = CKContainer.default().publicCloudDatabase
      let pred = NSPredicate(value: true)
      let query = CKQuery(recordType: "question", predicate: pred)
      publicData.perform(query, inZoneWith: nil, completionHandler: {results, error in
        if error != nil {
         completion(.failure(error!))
        } else {
          var data = [Q]()
          for result in results! {
            let quest = result.object(forKey: "question_name") as! String
            let a = result.object(forKey: "a") as! String
            let b = result.object(forKey: "b") as! String
            let c = result.object(forKey: "c") as! String
            let d = result.object(forKey: "d") as! String
            let answer = result.object(forKey: "answer") as! String
            let category = result.object(forKey: "category") as! String
            let final = Q(quest: quest, A:a, B: b, C: c, D: d, answer: answer, category: category)
            data.append(final)
          }
          completion(.success(data))
        }
      })
    }
    
  • 调用函数

    loadData { result in
      switch result {
      case .success(let data): print(data) // do something with the result
      case .failure(let error): print(error)
      }
    }