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

时间:2017-09-09 02:20:22

标签: swift swift4 xcode9-beta

我正在尝试使用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

3 个答案:

答案 0 :(得分:25)

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

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

答案 1 :(得分:4)

在这种情况下,问题是对可选的重叠访问 所以最简单的解决方案是先解开urlComponents 改变其queryItems

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

答案 2 :(得分: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 }
}