如何将 MKLocalSearch 的结果保存到数组中?

How do I save the results of a MKLocalSearch to an Array?

我在 SwiftUI 中开发我的应用程序时遇到了一些麻烦。 我想将总结在一个对象中的相关数据附加到一个数组中,然后 return 这个。 在 returning 数组时,我可以通过调试看到它是空的。 for 循环中的调试告诉我,位置对象已创建并附加,但未“保存”在数组中。另一方面,“mapItems”数组有很多成员。 我错过了什么?

这是我想出的方法:

func searchForLocation(searchTerm: String) -> Array<Location>{
 var locations = [Location]
 let searchReqeust = MKLocalSearch.Request()
 searchRequest.region = region //region is a published variable and is determined before
 searchRequest.naturalLanguageQuery = searchTerm
 
 let search = MKLocalSearch(request: searchRequest)
 search.start{response, error in
 //error handling
 .
 .
 .
 //empty response.mapItems handling
 .
 .
 .     
    for item in response!mapItems{
       let location = createLocationFromItem(item: item)
       locations.append(location)  
    }

  }
   return locations
}

我的位置 class 如果以下内容:

class Location: Identifiable{
   var id= UUID()
   var coordinates: CLLocationCoordinate2d

   //And its proper init method
}

你的searchForLocation里面有一个异步函数(search.start{...}), 和你的代码 returns 在它完成获取结果之前。 要“等待”结果,请使用 completion/closure 处理程序, 像这样:

func searchForLocation(searchTerm: String, completion: @escaping ([Location]) -> ()) {
     var locations = [Location]()  // <-- here 
    // ....
    
    search.start{response, error in   // <-- here asynchronous function
        //... todo deal with errors, eg return completion([])
        for item in response!mapItems {
           let location = createLocationFromItem(item: item)
           locations.append(location)
        }
        completion(locations) // <- here return when finished
    }
}

并像这样调用函数:

searchForLocation(searchTerm: "Tokyo") { results in
    print("\(results)")  // <-- here results available, not before
}

我建议你 read-up 如何创建和使用 asynchronous functions,这些是在 Swift 中有效编码需要掌握的重要概念。