如何将 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 中有效编码需要掌握的重要概念。
我在 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 中有效编码需要掌握的重要概念。