【问题标题】:Swift 3 UnsafePointer($0) no longer compile in Xcode 8 beta 6Swift 3 UnsafePointer($0) 不再在 Xcode 8 beta 6 中编译
【发布时间】:2016-12-27 01:08:51
【问题描述】:

我的代码片段如下……:

    let defaultRouteReachability = withUnsafePointer(to: &zeroAddress) {
        SCNetworkReachabilityCreateWithAddress(nil, UnsafePointer($0))
    }

…不再编译,出现以下我不明白的错误:

"'init' is unavailable: use 'withMemoryRebound(to:capacity:_)' to temporarily view memory as another layout-compatible type."

如何解决?

【问题讨论】:

标签: swift3 unsafe-pointers xcode8-beta6


【解决方案1】:

来自 Xcode 8 beta 6 的发行说明:

  • 引入了Unsafe[Mutable]RawPointer 类型,替换了Unsafe[Mutable]Pointer<Void>。从UnsafePointer<T> 转换为 UnsafePointer<U> 已被禁止。 Unsafe[Mutable]RawPointer 提供了一个用于无类型内存访问的 API,以及一个用于绑定的 API 记忆到一种类型。绑定内存允许在 指针类型。见bindMemory(to:capacity:)assumingMemoryBound(to:), 和withMemoryRebound(to:capacity:)。 (SE-0107)

在你的情况下,你可能需要这样写:

let defaultRouteReachability = withUnsafePointer(to: &zeroAddress) {
    $0.withMemoryRebound(to: sockaddr.self, capacity: 1) {zeroSockAddress in
        SCNetworkReachabilityCreateWithAddress(nil, zeroSockAddress)
    }
}

【讨论】:

    【解决方案2】:

    替换

    let defaultRouteReachability = withUnsafePointer(to: &zeroAddress) {
      SCNetworkReachabilityCreateWithAddress(nil, UnsafePointer($0))
    }
    

    guard let defaultRouteReachability = withUnsafePointer(to: &zeroAddress, {
    
            $0.withMemoryRebound(to: sockaddr.self, capacity: 1) {
    
                SCNetworkReachabilityCreateWithAddress(nil, $0)
    
            }
    
        }) else {
    
            return false
        }
    

    【讨论】:

      【解决方案3】:

      Swift 3 更新了语法,确切的解决方案是,

      guard let defaultRouteReachability = withUnsafePointer(to: &zeroAddress, {
          $0.withMemoryRebound(to: sockaddr.self, capacity: 1) {
              zeroSockAddress in SCNetworkReachabilityCreateWithAddress(nil, zeroSockAddress)} 
      } ) else { 
          return false 
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-29
        • 2016-12-27
        • 1970-01-01
        • 2014-08-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多