我正在尝试将此代码段转换为Swift。由于某些困难,我正在努力下车。
- (BOOL) connectedToNetwork
{
// Create zero addy
struct sockaddr_in zeroAddress;
bzero(&zeroAddress, sizeof(zeroAddress));
zeroAddress.sin_len = sizeof(zeroAddress);
zeroAddress.sin_family = AF_INET;
// Recover reachability flags
SCNetworkReachabilityRef defaultRouteReachability = SCNetworkReachabilityCreateWithAddress(NULL, (struct sockaddr *)&zeroAddress);
SCNetworkReachabilityFlags flags;
BOOL didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags);
CFRelease(defaultRouteReachability);
if (!didRetrieveFlags)
{
return NO;
}
BOOL isReachable = flags & kSCNetworkFlagsReachable;
BOOL needsConnection = flags & kSCNetworkFlagsConnectionRequired;
return (isReachable && !needsConnection) ? YES : NO;
}
我遇到的第一个也是主要的问题是如何定义和使用C结构。struct sockaddr_in zeroAddress;
我认为,在上述代码的第一行()中,我认为他们正在定义zeroAddress
从struct sockaddr_in(?)调用的实例。我试图声明var
这样的。
var zeroAddress = sockaddr_in()
但是我在调用中得到了参数'sin_len'的错误Missing参数,这是可以理解的,因为该结构需要多个参数。所以我再次尝试。
var zeroAddress = sockaddr_in(sin_len: sizeof(zeroAddress), sin_family: AF_INET, sin_port: nil, sin_addr: nil, sin_zero: nil)
不出所料,我在它自己的初始值中使用了其他错误变量。我也了解该错误的原因。在C语言中,他们首先声明实例,然后填充参数。据我所知,这在Swift中是不可能的。因此,我现在真的迷失了该做什么。
我阅读了Apple的有关在Swift中与C API进行交互的官方文档,但其中没有使用结构的示例。
有人可以在这里帮我吗?我真的很感激。
谢谢。
更新:感谢马丁,我得以解决最初的问题。但是Swift仍然不能让我更容易。我遇到了多个新错误。
func connectedToNetwork() -> Bool {
var zeroAddress = sockaddr_in(sin_len: 0, sin_family: 0, sin_port: 0, sin_addr: in_addr(s_addr: 0), sin_zero: (0, 0, 0, 0, 0, 0, 0, 0))
zeroAddress.sin_len = UInt8(sizeofValue(zeroAddress))
zeroAddress.sin_family = sa_family_t(AF_INET)
var defaultRouteReachability: SCNetworkReachabilityRef = SCNetworkReachabilityCreateWithAddress(UnsafePointer<Void>, UnsafePointer<zeroAddress>) // 'zeroAddress' is not a type
var flags = SCNetworkReachabilityFlags()
let didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, UnsafeMutablePointer<flags>) // 'flags' is not a type
defaultRouteReachability.dealloc(1) // 'SCNetworkReachabilityRef' does not have a member named 'dealloc'
if didRetrieveFlags == false {
return false
}
let isReachable: Bool = flags & kSCNetworkFlagsReachable // Cannot invoke '&' with an argument list of type '(@lvalue UInt32, Int)'
let needsConnection: Bool = flags & kSCNetworkFlagsConnectionRequired // Cannot invoke '&' with an argument list of type '(@lvalue UInt32, Int)'
return (isReachable && !needsConnection) ? true : false
}
编辑1: 好的,我将此行更改为此,
var defaultRouteReachability: SCNetworkReachabilityRef = SCNetworkReachabilityCreateWithAddress(UnsafePointer<Void>(), &zeroAddress)
我在这一行遇到的新错误是'UnsafePointer'无法转换为'CFAllocator'。如何通过NULL
Swift?
我也改变了这一行,错误现在消失了。
let didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags)
编辑2:nil
看到此问题后,我通过了这一行。但是那个答案与这里的答案相矛盾。它说NULL
在Swift中没有等效的功能。
var defaultRouteReachability: SCNetworkReachabilityRef = SCNetworkReachabilityCreateWithAddress(nil, &zeroAddress)
无论如何,我收到一个新错误,说上一行中的'sockaddr_in'与'sockaddr'不相同。