Swift 3 - сбой CFHostScheduleWithRunLoop

Я делаю обратный DNS в Swift, мой предыдущий код на Swift 2.2 работал нормально, также я реализовал его в Objective-C, и он работает. Однако я не могу заставить его работать в Swift 3.0

Swift 2.2

//: Let's set up the `sockaddr_in` C structure using the initializer.
var sin = sockaddr_in(
    sin_len: UInt8(sizeof(sockaddr_in)),
    sin_family: sa_family_t(AF_INET),
    sin_port: in_port_t(0),
    sin_addr: in_addr(s_addr: inet_addr(ip)),
    sin_zero: (0,0,0,0,0,0,0,0)
)

//: Now convert the structure into a `CFData` object.
let data = withUnsafePointer(&sin) { ptr in
    CFDataCreate(kCFAllocatorDefault, UnsafePointer(ptr), sizeof(sockaddr_in))
}

//: Create the `CFHostRef` with the `CFData` object and store the retained value for later use.
let host = CFHostCreateWithAddress(kCFAllocatorDefault, data).takeRetainedValue()

//: Now schedule the runloop for the host.
CFHostScheduleWithRunLoop(host!, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode)

var error = CFStreamError()

//: Start the info resolution.
CFHostStartInfoResolution(host!, .Names, &error)

Swift 3.0

//: Let's set up the `sockaddr_in` C structure using the initializer.
var sin = sockaddr_in(
    sin_len: UInt8(sizeof(sockaddr_in)),
    sin_family: sa_family_t(AF_INET),
    sin_port: in_port_t(0),
    sin_addr: in_addr(s_addr: inet_addr(ip)),
    sin_zero: (0,0,0,0,0,0,0,0)
)

//: Now convert the structure into a `CFData` object.
let data = NSData(bytes: &sin, length: MemoryLayout<sockaddr_in>.size) as CFData

//: Create the `CFHostRef` with the `CFData` object and store the retained value for later use.
let host = CFHostCreateWithAddress(kCFAllocatorDefault, data).takeRetainedValue()

//: Now schedule the runloop for the host.
CFHostScheduleWithRunLoop(host!, CFRunLoopGetCurrent(), CFRunLoopMode.defaultMode as! CFString)

var error = CFStreamError()

//: Start the info resolution.
CFHostStartInfoResolution(host!, .Names, &error)

Когда я запустил этот код, он падает

CFHostScheduleWithRunLoop

любая идея?

1 ответ

Попробуйте заменить:

CFRunLoopMode.defaultMode as! CFString

с:

CFRunLoopMode.defaultMode!.rawValue
Другие вопросы по тегам