【问题标题】:Overlapping accesses to 'urlComponents', but modification requires exclusive access对“urlComponents”的访问重叠,但修改需要独占访问
【发布时间】:2018-02-17 23:25:35
【问题描述】:

我正在尝试将 Lyft API 与 iOS 11 和 Swift 4 一起使用,并在第二行收到错误,即

对“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!, resolveAgainstBaseURL: false) var localVariable = urlComponents localVariable?。 queryItems = (urlComponents?.queryItems ?? []) + queryItems ,然后像这样分配回去 urlComponents = localVariable
  • 直接在编辑之前添加
  • 3stud1ant3 效果很好,您想提交作为答案以便我接受吗?
  • 当您没有解开可选的实例变量时也会发生这种情况。如果您将 mutableURLRequest 放在 Guard var 语句中,它也应该解决编译器错误。

标签: swift swift4 xcode9-beta


【解决方案1】:

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

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

【讨论】:

  • 相信你可以把第3行改为:urlComponents?.queryItems = (localVariable?.queryItems ?? []) + queryItems
【解决方案2】:

在这种情况下,问题是重叠访问一个可选, 所以最简单的解决方案是在之前解开urlComponents 改变它的queryItems:

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

【讨论】:

    【解决方案3】:

    可能与问题详细信息没有直接关系,但对于任何在谷歌上搜索此错误消息的人,请注意,尝试使用不明确类型的数据进行操作时也会发生错误(不清楚它是类还是结构操纵时刻)。

    可能出现此错误的示例:

    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 }
    }
    

    【讨论】:

      猜你喜欢
      • 2019-01-11
      • 2018-03-07
      • 1970-01-01
      • 2019-05-06
      • 1970-01-01
      • 1970-01-01
      • 2018-02-21
      • 2019-10-28
      • 1970-01-01
      相关资源
      最近更新 更多