Swift3 “init”不可用:使用“withMemoryRebound(to:Capacity:u2;)”不可用指针
我想在Swift 3和Swift 4中使用此Swift 2代码:Swift3 “init”不可用:使用“withMemoryRebound(to:Capacity:u2;)”不可用指针,swift3,swift2,task,swift4,info,Swift3,Swift2,Task,Swift4,Info,我想在Swift 3和Swift 4中使用此Swift 2代码: func getLocalIP() -> String { var address = "error" var interfaces : UnsafeMutablePointer<ifaddrs>? = nil var temp_addr : UnsafeMutablePointer<ifaddrs>? = nil var success : Int32 = 0
func getLocalIP() -> String {
var address = "error"
var interfaces : UnsafeMutablePointer<ifaddrs>? = nil
var temp_addr : UnsafeMutablePointer<ifaddrs>? = nil
var success : Int32 = 0
// Retrieve the current interfaces - returns 0 on success.
success = getifaddrs(&interfaces)
if success == 0 {
// Loop through linked list of interfaces.
temp_addr = interfaces
while temp_addr != nil {
if temp_addr?.pointee.ifa_addr.pointee.sa_family == UInt8(AF_INET) {
// Check if interface is en0 which is the wifi connection on the iPhone.
if String(cString: (temp_addr?.pointee.ifa_name)!) == "en0" {
// Get NSString from C string.
address = String(cString: inet_ntoa(UnsafeMutablePointer<sockaddr_in>((temp_addr?.pointee.ifa_addr)!).pointee.sin_addr))
}
}
temp_addr = temp_addr?.pointee.ifa_next
}
}
// Free memory.
freeifaddrs(interfaces)
return address
}
我在UnsafeMutablePointer中得到一个错误:
“init”不可用:use“withMemoryReboundto:Capacity:'错误文本准确地说明了错误和应该做的事情:您不能再仅仅使用指向另一种类型的指针创建不可用的指针,您必须使用方法 在你的情况下,你应该更换
String(cString: inet_ntoa(UnsafeMutablePointer<sockaddr_in>((temp_addr?.pointee.ifa_addr)!).pointee.sin_addr))
或者这里是完全重写和增强的函数版本:
enum LocalIPError: Error {
case failedToRetrieveInterfaces(errorCode: Int32)
case noEn0Address
}
func getLocalIP() throws -> String {
// Retrieve the current interfaces - returns 0 on success.
var interfaces : UnsafeMutablePointer<ifaddrs>? = nil
let errorCode = getifaddrs(&interfaces)
defer {
// Free memory.
freeifaddrs(interfaces)
}
guard
errorCode == 0,
let interfaceSequence = interfaces.flatMap({ first_addr in
sequence(
first: first_addr,
next: { addr in addr.pointee.ifa_next }
)
})
else { throw LocalIPError.failedToRetrieveInterfaces(errorCode: errorCode) }
if let address = interfaceSequence.compactMap({ (temp_addr) -> String? in
guard
let ifa_addr = temp_addr.pointee.ifa_addr,
ifa_addr.pointee.sa_family == sa_family_t(AF_INET),
// Check if interface is en0 which is the wifi connection on the iPhone.
String(cString: (temp_addr.pointee.ifa_name)) == "en0"
else { return nil }
return ifa_addr.withMemoryRebound(to: sockaddr_in.self, capacity: 1, { sockaddr_ptr -> String? in
guard let sin_addr = inet_ntoa(sockaddr_ptr.pointee.sin_addr) else { return nil }
return String(cString: sin_addr)
})
}).last {
return address
} else {
throw LocalIPError.noEn0Address
}
}
enum LocalIPError: Error {
case failedToRetrieveInterfaces(errorCode: Int32)
case noEn0Address
}
func getLocalIP() throws -> String {
// Retrieve the current interfaces - returns 0 on success.
var interfaces : UnsafeMutablePointer<ifaddrs>? = nil
let errorCode = getifaddrs(&interfaces)
defer {
// Free memory.
freeifaddrs(interfaces)
}
guard
errorCode == 0,
let interfaceSequence = interfaces.flatMap({ first_addr in
sequence(
first: first_addr,
next: { addr in addr.pointee.ifa_next }
)
})
else { throw LocalIPError.failedToRetrieveInterfaces(errorCode: errorCode) }
if let address = interfaceSequence.compactMap({ (temp_addr) -> String? in
guard
let ifa_addr = temp_addr.pointee.ifa_addr,
ifa_addr.pointee.sa_family == sa_family_t(AF_INET),
// Check if interface is en0 which is the wifi connection on the iPhone.
String(cString: (temp_addr.pointee.ifa_name)) == "en0"
else { return nil }
return ifa_addr.withMemoryRebound(to: sockaddr_in.self, capacity: 1, { sockaddr_ptr -> String? in
guard let sin_addr = inet_ntoa(sockaddr_ptr.pointee.sin_addr) else { return nil }
return String(cString: sin_addr)
})
}).last {
return address
} else {
throw LocalIPError.noEn0Address
}
}