Ah the missing part of the puzzle appears to be unsafeBitCast(:to:), so the 
Swift version becomes this:

switch generic.sa_family {
case sa_family_t(AF_INET):
    let ipv4 = unsafeBitCast(generic, to: sockaddr_in.self)
    //...
case sa_family_t(AF_INET6):
    let ipv6 = unsafeBitCast(generic, to: sockaddr_in6.self)
    //...
default:
    //...
}

—
Bouke

> On 12 sep. 2016, at 21:25, Bouke Haarsma <bo...@haarsma.eu> wrote:
> 
> Hi all,
> 
> Inside my CFSocketCallBack a pointer to a sockaddr is provided wrapped in a 
> CFData structure. The sockaddr could be either a sockaddr_in (IPv4) or 
> sockaddr_in6 (IPv6) struct. In order to discover which struct you’re dealing 
> with, the attribute sa_family can be inspected. In C this would look 
> something like this:
> 
> struct sockaddr_storage sa;
> 
> switch (((sockaddr*)&sa)->sa_family)
> {
>     case AF_INET:
>         inet_ntop(AF_INET, &(((sockaddr_in*)&sa)->sin_addr), ...);
>         break;
>     case AF_INET6:
>         inet_ntop(AF_INET6, &(((sockaddr_in6*)&sa)->sin6_addr), ...);
>         break;
> }
> (from: http://stackoverflow.com/a/13167913 
> <http://stackoverflow.com/a/13167913>)
> 
> Wheras to do this in Swift 3, the only way I found thus far is this:
> 
> var generic = CFDataGetBytePtr(data).withMemoryRebound(to: sockaddr.self, 
> capacity: 1) {
>     return $0.pointee
> }
> switch generic.sa_family {
> case sa_family_t(AF_INET):
>     let ipv4 = withUnsafePointer(to: &generic) {
>         $0.withMemoryRebound(to: sockaddr_in.self, capacity: 1) {
>             $0.pointee
>         }
>     }
>     //...
> case sa_family_t(AF_INET6):
>     let ipv6 = withUnsafePointer(to: &generic) {
>         $0.withMemoryRebound(to: sockaddr_in6.self, capacity: 1) {
>             $0.pointee
>         }
>     }
>     //...
> default:
>     //…
> }
> 
> This looks very ugly with all the closures and ``withMemoryRebound``. Is 
> there a better way to do this? I think there should be something more 
> “Swifty”.
> 
> —
> Bouke

_______________________________________________
swift-users mailing list
swift-users@swift.org
https://lists.swift.org/mailman/listinfo/swift-users

Reply via email to