2016-08-19 49 views
58

我的一小段代码片段如下...:

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." 

如何解决?

+3

注意http://stackoverflow.com/a/25623647/1187415已经更新为当前斯威夫特3. –

回答

119

从Xcode的8个β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) 
    } 
} 
+0

是,它为me..Thanks工作 – TBI

18

更换

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

斯威夫特3更新了语法,确切的解决方案是,

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