重叠访问'urlComponents',但修改需要独占访问权限

问题描述 投票:10回答:3

我试图使用与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
swift swift4 xcode9-beta
3个回答
28
投票

我想你需要首先设置一个局部变量,然后更改它,试试这个:

var urlComponents = URLComponents(url: mutableURLRequest.url!, resolvingAgainstBaseURL: false) 
var localVariable = urlComponents 
urlComponents?.queryItems = (localVariable?.queryItems ?? []) + queryItems  

5
投票

在这种情况下,问题是对可选项的重叠访问,因此最简单的解决方案是在变换其urlComponents之前解开queryItems

if var urlComponents = URLComponents(url: mutableURLRequest.url!, resolvingAgainstBaseURL: false) {
    urlComponents.queryItems = (urlComponents.queryItems ?? []) + queryItems
    // ...
}

1
投票

可能与问题细节没有直接关系,但对于搜索此错误消息的任何人,请注意在尝试使用模糊类型的数据时也会发生错误(目前还不清楚它是在操作时是类还是结构)。

出现此错误时的示例:

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 }
}
© www.soinside.com 2019 - 2024. All rights reserved.