2017-01-25 2 views
0

내가 틀렸어 야합니다 - 다음 코드를 변경했지만 여전히 오류가 발생합니다. 나는 분명히 뭔가 잘못 이해했다. 어떤 도움에 감사드립니다.Swift3에서 위치 검색을위한 완료 핸들러

func performSearch() { 
    mapView.delegate = self 
    matchingItems.removeAll() 
    let request = MKLocalSearchRequest() 
    request.naturalLanguageQuery = searchText.text 
    request.region = mapView.region 
    let search = MKLocalSearch(request: request) 

    search.start(completionHandler: ({(response: MKLocalSearchResponse?,error: NSError?) in 
     if error != nil { 
      return 
     } 
     if response!.mapItems.count == 0 { 
      self.resultOfSearch.text = ("No matches found") 

     }else{ 
      self.found = response!.mapItems 
      if let items = response?.mapItems, items.count > 0 { 
       while self.n < 3 && self.n < response!.mapItems.count { self.locationsRet[(response!.mapItems[self.n].name!)] = self.n; self.n = self.n + 1} 
       self.n = 0 
      }else{ 
       self.alert2("NOLOC") 
      } 

      self.alert3(self.locationsRet, found: self.found) 
     } 

     } as? MKLocalSearchCompletionHandler)!) 
} 

그래도 오류가 발생합니다. 내가 잘못 했습니까?

이 코드는 스위프트 2에서 잘 작동하지만, 충돌 스위프트 3.

func performSearch() { 
    mapView.delegate = self 
    matchingItems.removeAll() 
    let request = MKLocalSearchRequest() 
    request.naturalLanguageQuery = searchText.text 
    request.region = mapView.region 
    let search = MKLocalSearch(request: request) 
    search.start(completionHandler: ({(response: MKLocalSearchResponse?,error: NSError?) in 
     if error != nil { 
      //self.resultOfSearch.text = ("Error occured in search:\(error!.localizedDescription)") 
     } else if response!.mapItems.count == 0 { 
      self.resultOfSearch.text = ("No matches found") 
      // }else if response!.mapItems.count > 1 { 
     }else{ 
      self.found = response!.mapItems 
      for _ in response!.mapItems { 
       if response!.mapItems.count > 0 { 
        while self.n < 3 && self.n < response!.mapItems.count { self.locationsRet[(response!.mapItems[self.n].name!)] = self.n; self.n = self.n + 1} 
        self.n = 0 
       }else{ 
        self.alert2("NOLOC") 

       } 
      } 
      self.alert3(self.locationsRet, found: self.found) 
     } 

     } as? MKLocalSearchCompletionHandler)!) 
} 

이 코드는 지금이 오류를 제공

; 이 방법으로 같은 MKLocalSearch에 시작 메소드를 호출 할 필요가 있으므로

function signature specialization <preserving fragile attribute, Arg[1] = [Closure Propagated : reabstraction thunk helper from @callee_owned (@unowned Swift.UnsafeBufferPointer<Swift.UInt8>) ->() to @callee_owned (@unowned Swift.UnsafeBufferPointer<Swift.UInt8>) -> (@out()), Argument Types : [@callee_owned (@unowned Swift.UnsafeBufferPointer<Swift.UInt8>) ->()]> of generic specialization <preserving fragile attribute,()> of Swift.StaticString.withUTF8Buffer <A> ((Swift.UnsafeBufferPointer<Swift.UInt8>) -> A) -> A 
-> 0x5bf2e0 <+124>: trap 

답변

2

MKLocalSearchCompletionHandler의 서명이 변경됩니다.

search.start { (response: MKLocalSearchResponse?, error: Error?) in 
    if error != nil { 
     return 
    } 
    if let items = response?.mapItems, items.count > 0 { 
     //access the items using while loop only 
    } 
    else { 
     self.alert2("NOLOC") 
    } 
} 

참고 : 코드에서 for 루프의 불필요한 사용이, 당신은 단순히 루프 동안 안 하나에 대한 필요가있다. 제안

행 1 :

0

내 오류가 발견 search.start {

에서 (응답 : MKLocalSearchResponse? 오류? 오류) 한 후 마지막 줄 : } //로?

MKLocalSearchCompletionHandler

그래서 어떤 완료 핸들러는 그것은

+0

내가 처음으로} 제거 후 첫 번째 줄을 이해하지 않고 완벽하게 작동하지? MKLocalSearchCompletionHandler)!) - 이제 이해하고 감사합니다. – Jeremy

+0

환영 메이트 :) –

관련 문제