【问题标题】: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
}