Невозможно развернуть Обещание <[CLPlacemark]> - PullRequest
0 голосов
/ 03 ноября 2018

У меня есть метод, который пытается обновить мой авторизованный статус.

Используя PromiseKit 6, Swift 4.2, я не могу заставить свое обещание <[CLPlacemark]> быть просто CLPlacemark.

Это вызывает цепочку ошибок

Value of type 'Promise<[CLPlacemark]>' has no member 'foo'

Вот посмотрите на мой код:

func updateAuthStatus(status: CLAuthorizationStatus) {
    if status == .authorizedWhenInUse {
        titleLabel.isHidden = true
        bigIconView.isHidden = true
        descriptionLabel.isHidden = true
        grantBtn.isHidden = true
        titleLabel1.isHidden = false
        loaderView.isHidden = false
        loaderView.resumeSpinning()
        CLLocationManager.requestLocation().compactMapValues { location in
            return self.coder.reverseGeocode(location: location)
        }.compactMapValues { placemark -> Void in
            if placemark.ISOcountryCode == "CA" {
                self.seal.fulfill(())
            } else if placemark.ISOcountryCode == "US" {
                if self.allowedStates.contains(placemark.administrativeArea ?? "") {
                    self.seal.fulfill(())
                } else {
                        self.seal.reject(LocationError.InvalidState(placemark.administrativeArea ?? ""))
                }
            } else {
        self.seal.reject(LocationError.InvalidCountry(placemark.ISOcountryCode ?? ""))
            }
        }
    }
    else if status == .denied || status == .restricted {
        if denied == false {
            self.seal.reject(LocationError.Unknown)
        }
        denied = true
    }
}

1 Ответ

0 голосов
/ 04 ноября 2018

Как вы упомянули, этот promise возвращает массив CLPlacemark объектов, поэтому вам нужно получить конкретный placemark из array и затем использовать его. Вот пример доступа к first placemark в array.

.compactMapValues { placemarks -> Void in
            guard let placemark = placemarks.first else { return }

            if placemark.ISOcountryCode == "CA" {
                self.seal.fulfill(())
            } else if placemark.ISOcountryCode == "US" {
                if self.allowedStates.contains(placemark.administrativeArea ?? "") {
                    self.seal.fulfill(())
                } else {
                  self.seal.reject(LocationError.InvalidState(placemark.administrativeArea ?? ""))
                }
            } else {
        self.seal.reject(LocationError.InvalidCountry(placemark.ISOcountryCode ?? ""))
            }
        }

Редактировать

Для обработки в США и ЦА соответствующая метка для этой страны может быть извлечена, как показано ниже,

.compactMapValues { placemarks -> Void in
       if let ca = placemarks.filter{ $0.ISOcountryCode == "CA"}.first {
            self.seal.fulfill(())
       } else if let usa = placemarks.filter{ $0.ISOcountryCode == "US"}.first {
            if self.allowedStates.contains(usa.administrativeArea ?? "") {
                self.seal.fulfill(())
            } else {
                let error = LocationError.InvalidState(usa.administrativeArea ?? "")
                self.seal.reject(error)
            }
    } else {
         let error = LocationError.InvalidCountry(placemarks.first?.ISOcountryCode ?? "")
         self.seal.reject(error)
     }
 }
...