我试图使用与iOS 11和Swift 4的Lyft API,并在第二行收到错误,这是
重叠访问'urlComponents',但修改需要独占访问;考虑复制到局部变量。
我不确定这意味着什么,以及如何绕过它。任何帮助表示赞赏,谢谢!
let queryItems = parameters
.sorted { $0.0 < $1.0 }
.flatMap { components(forKey: $0, value: $1) }
var urlComponents = URLComponents(url: mutableURLRequest.url!, resolvingAgainstBaseURL: false)
urlComponents?.queryItems = (urlComponents?.queryItems ?? []) + queryItems //error here
我想你需要首先设置一个局部变量,然后更改它,试试这个:
var urlComponents = URLComponents(url: mutableURLRequest.url!, resolvingAgainstBaseURL: false)
var localVariable = urlComponents
urlComponents?.queryItems = (localVariable?.queryItems ?? []) + queryItems
在这种情况下,问题是对可选项的重叠访问,因此最简单的解决方案是在变换其urlComponents
之前解开queryItems
:
if var urlComponents = URLComponents(url: mutableURLRequest.url!, resolvingAgainstBaseURL: false) {
urlComponents.queryItems = (urlComponents.queryItems ?? []) + queryItems
// ...
}
可能与问题细节没有直接关系,但对于搜索此错误消息的任何人,请注意在尝试使用模糊类型的数据时也会发生错误(目前还不清楚它是在操作时是类还是结构)。
出现此错误时的示例:
protocol: AnItemCapableToShowDetails {
var isShowingDetails: Bool { get set }
}
class: DataItem, AnItemCapableToShowDetails {
...
var isShowingDetails = false
}
class: SomeClass {
func showDetails() {
if let dataItem = itemsArray[index] as? AnItemCapableToShowDetails {
...
dataItem.isShowingDetails = !dataItem.isShowingDetails // <- "Overlapping accesses..." error here
// because that protocol might
// potentially be applied to a struct as well
}
}
}
可能的解决方法是使其成为仅限类的协议,以便确保编译器始终使用类进行操作。
在Swift 4之前:
protocol: AnItemCapableToShowDetails: class {
var isShowingDetail: Bool { get set }
}
在Swift 4及更高版本中也可用(并且是这样做的首选方式):
protocol: AnItemCapableToShowDetails: AnyObject {
var isShowingDetail: Bool { get set }
}