如何在Swift中检查标志的位域(特别是SCNetworkReachabilityFlags)?

sno*_*nod 5 bitmask ios bit-fields swift

我有一个SCNetworkReachabilityFlags变量,想要检查它的特定值,例如,如果网络可以通过WWAN访问.

SCNetworkReachabilityFlags类型是typealias用于UInt32与各种选项被定义为Int变量.

使用Objective-C,您可以执行以下操作:

if (flags & kSCNetworkReachabilityFlagsIsWWAN) {
 // do stuff
}
Run Code Online (Sandbox Code Playgroud)

在Swift中如果我试试这个:

if reachabilityFlags & kSCNetworkReachabilityFlagsIsWWAN {
 // do stuff
}
Run Code Online (Sandbox Code Playgroud)

你得到一个编译器错误:Could not find an overload for '&' that accepts the supplied arguments.

我已经阅读了一些其他问题,其中位域选项定义为RawOptionSet结构.这还没有完成SCNetworkReachability.

如何检查Swift中的标志?

Nat*_*ook 5

该错误实际上不是抱怨标志检查的参数,而是抱怨返回值。语句if需要一个布尔值(或者至少是符合 的值Logical),但&两个Int值的运算符返回一个Int。您只需要在声明中进行比较if

let flags = kSCNetworkReachabilityFlagsReachable
if 0 != flags & kSCNetworkReachabilityFlagsReachable {
    println("flags contains kSCNetworkReachabilityFlagsReachable")
}
Run Code Online (Sandbox Code Playgroud)

由于SCNetworkReachabilityFlags和 常量(奇怪地)属于不同类型,因此您需要进行一些转换才能进行比较:

let reachabilityFlags:SCNetworkReachabilityFlags = SCNetworkReachabilityFlags(kSCNetworkReachabilityFlagsReachable)
if 0 != reachabilityFlags & SCNetworkReachabilityFlags(kSCNetworkReachabilityFlagsReachable) {
    println("reachabilityFlags contains kSCNetworkReachabilityFlagsReachable")
}
Run Code Online (Sandbox Code Playgroud)