【发布时间】:2014-10-26 17:04:55
【问题描述】:
我正在尝试将this 代码 sn-p 转换为 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;) 中,我认为他们从 struct sockaddr_in(?) 定义了一个名为 zeroAddress 的实例。我尝试像这样声明var。
var zeroAddress = sockaddr_in()
但我得到错误 Missing argument for parameter 'sin_len' in call 这是可以理解的,因为该结构需要许多参数。于是我又试了一次。
var zeroAddress = sockaddr_in(sin_len: sizeof(zeroAddress), sin_family: AF_INET, sin_port: nil, sin_addr: nil, sin_zero: nil)
正如预期的那样,我得到了一些其他错误变量在其自己的初始值中使用。我也了解该错误的原因。在 C 中,它们首先声明实例,然后填充参数。据我所知,它在 Swift 中是不可能的。所以我现在真的不知道该怎么做。
我阅读了 Apple 的官方 document 关于在 Swift 中与 C API 交互的内容,但它没有使用结构的示例。
有人可以帮我吗?我真的很感激。
谢谢。
更新:感谢 Martin,我能够克服最初的问题。但是 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' is not convertible to 'CFAllocator'。如何在 Swift 中传递 NULL?
我也更改了这一行,现在错误消失了。
let didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags)
编辑 2: 在看到this 问题后,我在这一行中通过了nil。但是这个答案与here 的答案相矛盾。它说在 Swift 中没有等同于 NULL 的东西。
var defaultRouteReachability: SCNetworkReachabilityRef = SCNetworkReachabilityCreateWithAddress(nil, &zeroAddress)
无论如何,我在上面的行中收到一个新错误,说 'sockaddr_in' 与 'sockaddr' 不同。
【问题讨论】:
-
如果 !SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags) 即一元运算符,我在行出现错误!不能应用于布尔类型的操作数。 . . .请帮忙。
标签: ios c struct swift reachability