ios - 无法解开 Promise<[CLPlacemark]>
问题描述
我有一种方法可以尝试更新我的授权状态。
使用 PromiseKit 6、Swift 4.2,我似乎无法让我的 Promise<[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
}
}
解决方案
正如您所提到的,这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 ?? ""))
}
}
编辑
要处理 US 和 CA,可以提取该国家/地区的相关地标,如下所示,
.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)
}
}
推荐阅读
- c++ - 是否有一种(文献)算法将节点拆分为每个传入边缘的一个节点?
- php - 为什么我的表单输入值没有传递到数据库
- python - Python 到 C++ 的字典列表
- javascript - 5分钟后空闲用户注销不能在Angular-7的所有页面上正常工作?
- php - Wamp 服务器 aestan 托盘菜单内部错误
- reactjs - MERN 堆栈应用程序在部署到 heroku 时显示空白屏幕
- ruby-on-rails - Rails 上的 Simple_form_for - 如何在提交后显示错误验证
- bash - BASH:将查找命令的值打印到某个点并分配给一个变量
- node.js - nodejs - 在 Windows 文件服务器上保持会话
- python-2.7 - 想在 tkinter gui 窗口中创建两个标签并显示连续计数值: