Swift 3 UnsafePointer($0) 在 Xcode 8 beta 6 中不再编译
Swift 3 UnsafePointer($0) no longer compile in Xcode 8 beta 6
我的代码片段如下……:
let defaultRouteReachability = withUnsafePointer(to: &zeroAddress) {
SCNetworkReachabilityCreateWithAddress(nil, UnsafePointer([=12=]))
}
… 不再编译出现以下我不理解的错误:
"'init' is unavailable: use 'withMemoryRebound(to:capacity:_)' to temporarily view memory as another layout-compatible type."
如何解决?
来自 Xcode 8 beta 6 的发行说明:
- An
Unsafe[Mutable]RawPointer
type has been introduced, replacing Unsafe[Mutable]Pointer<Void>
. Conversion from UnsafePointer<T>
to
UnsafePointer<U>
has been disallowed. Unsafe[Mutable]RawPointer
provides an API for untyped memory access, and an API for binding
memory to a type. Binding memory allows for safe conversion between
pointer types. See bindMemory(to:capacity:)
, assumingMemoryBound(to:)
,
and withMemoryRebound(to:capacity:)
. (SE-0107)
在你的情况下,你可能需要这样写:
let defaultRouteReachability = withUnsafePointer(to: &zeroAddress) {
[=10=].withMemoryRebound(to: sockaddr.self, capacity: 1) {zeroSockAddress in
SCNetworkReachabilityCreateWithAddress(nil, zeroSockAddress)
}
}
替换
let defaultRouteReachability = withUnsafePointer(to: &zeroAddress) {
SCNetworkReachabilityCreateWithAddress(nil, UnsafePointer([=10=]))
}
和
guard let defaultRouteReachability = withUnsafePointer(to: &zeroAddress, {
[=11=].withMemoryRebound(to: sockaddr.self, capacity: 1) {
SCNetworkReachabilityCreateWithAddress(nil, [=11=])
}
}) else {
return false
}
Swift 3 更新了语法,具体解决办法是,
guard let defaultRouteReachability = withUnsafePointer(to: &zeroAddress, {
[=10=].withMemoryRebound(to: sockaddr.self, capacity: 1) {
zeroSockAddress in SCNetworkReachabilityCreateWithAddress(nil, zeroSockAddress)}
} ) else {
return false
}
我的代码片段如下……:
let defaultRouteReachability = withUnsafePointer(to: &zeroAddress) {
SCNetworkReachabilityCreateWithAddress(nil, UnsafePointer([=12=]))
}
… 不再编译出现以下我不理解的错误:
"'init' is unavailable: use 'withMemoryRebound(to:capacity:_)' to temporarily view memory as another layout-compatible type."
如何解决?
来自 Xcode 8 beta 6 的发行说明:
- An
Unsafe[Mutable]RawPointer
type has been introduced, replacingUnsafe[Mutable]Pointer<Void>
. Conversion fromUnsafePointer<T>
toUnsafePointer<U>
has been disallowed.Unsafe[Mutable]RawPointer
provides an API for untyped memory access, and an API for binding memory to a type. Binding memory allows for safe conversion between pointer types. SeebindMemory(to:capacity:)
,assumingMemoryBound(to:)
, andwithMemoryRebound(to:capacity:)
. (SE-0107)
在你的情况下,你可能需要这样写:
let defaultRouteReachability = withUnsafePointer(to: &zeroAddress) {
[=10=].withMemoryRebound(to: sockaddr.self, capacity: 1) {zeroSockAddress in
SCNetworkReachabilityCreateWithAddress(nil, zeroSockAddress)
}
}
替换
let defaultRouteReachability = withUnsafePointer(to: &zeroAddress) {
SCNetworkReachabilityCreateWithAddress(nil, UnsafePointer([=10=]))
}
和
guard let defaultRouteReachability = withUnsafePointer(to: &zeroAddress, {
[=11=].withMemoryRebound(to: sockaddr.self, capacity: 1) {
SCNetworkReachabilityCreateWithAddress(nil, [=11=])
}
}) else {
return false
}
Swift 3 更新了语法,具体解决办法是,
guard let defaultRouteReachability = withUnsafePointer(to: &zeroAddress, {
[=10=].withMemoryRebound(to: sockaddr.self, capacity: 1) {
zeroSockAddress in SCNetworkReachabilityCreateWithAddress(nil, zeroSockAddress)}
} ) else {
return false
}