最佳答案
我试图转换 这个代码片段到斯威夫特。我挣扎着离开地面由于一些困难。
- (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;
)中,我认为他们从 struct sockaddr _ In (?)定义了一个名为 zeroAddress
的实例我想是的。我试过像这样声明 var
。
var zeroAddress = sockaddr_in()
但是我得到了错误 调用中缺少参数‘ sin _ len’的参数,这是可以理解的,因为这个结构需要很多参数。所以我又试了一次。
var zeroAddress = sockaddr_in(sin_len: sizeof(zeroAddress), sin_family: AF_INET, sin_port: nil, sin_addr: nil, sin_zero: nil)
正如所料,我得到了一些其他的错误 变量在其自己的初始值内使用。我也明白那个错误的原因。在 C 语言中,它们首先声明实例,然后填充参数。据我所知,在斯威夫特是不可能的。所以我现在真的不知道该怎么办了。
我读过苹果官方关于在 Swift 中与 C API 交互的 文件,但它没有使用 structs 的例子。
有人能帮帮我吗? 我会很感激的。
谢谢你。
更新: 多亏了马丁,我才能解决最初的问题。但斯威夫特还是没让我好过。我收到了很多新的错误。
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’。如何在 Swift 中传递 NULL
?
我也改变了这一行,现在错误已经消失了。
let didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags)
编辑2: 在看到 这个问题后,我通过了这一行的 nil
。但这个答案与 给你的答案相矛盾。它说在 Swift 中没有相当于 NULL
的东西。
var defaultRouteReachability: SCNetworkReachabilityRef = SCNetworkReachabilityCreateWithAddress(nil, &zeroAddress)
无论如何,我得到一个新的错误说 ‘ sockaddr _ in’与‘ sockaddr’不同在上面的行。