2014-07-03 12 views
5

Ich habe eine SCNetworkReachabilityFlags Variable und möchte es für bestimmte Werte überprüfen, z. wenn das Netzwerk über WWAN erreichbar ist.Wie überprüft man Bitfelder (insbesondere SCNetworkReachabilityFlags) auf Flags in Swift?

Der Typ SCNetworkReachabilityFlags ist ein typealias für UInt32 und die verschiedenen Optionen sind als Int Variablen definiert.

Mit Objective-C Sie Folgendes tun könnte:

if (flags & kSCNetworkReachabilityFlagsIsWWAN) { 
// do stuff 
} 

In Swift wenn ich versuche, dies:

if reachabilityFlags & kSCNetworkReachabilityFlagsIsWWAN { 
// do stuff 
} 

Sie einen Compiler-Fehler: Could not find an overload for '&' that accepts the supplied arguments.

Ich habe einige andere Fragen gelesen, wo die Bitfeldoptionen als RawOptionSet struct definiert wurden. Dies wurde nicht in SCNetworkReachability getan.

Wie Sie nach Flaggen in Swift suchen?

Antwort

4

Dieser Fehler beschweren sich tatsächlich nicht über die Argumente Ihrer Flags-Prüfung, sondern über den Rückgabewert. Eine if-Anweisung erwartet einen booleschen Wert (oder zumindest etwas, der Logical entspricht), aber der Operator & für zwei Werte Int gibt einen Wert Int zurück. Sie brauchen nur einen Vergleich in Ihrer if Aussage:

let flags = kSCNetworkReachabilityFlagsReachable 
if 0 != flags & kSCNetworkReachabilityFlagsReachable { 
    println("flags contains kSCNetworkReachabilityFlagsReachable") 
} 

Da SCNetworkReachabilityFlags und die Konstanten sind (seltsam) unterschiedlichen Typs, werden Sie einige Casting tun müssen, um den Vergleich der Arbeit zu machen:

let reachabilityFlags:SCNetworkReachabilityFlags = SCNetworkReachabilityFlags(kSCNetworkReachabilityFlagsReachable) 
if 0 != reachabilityFlags & SCNetworkReachabilityFlags(kSCNetworkReachabilityFlagsReachable) { 
    println("reachabilityFlags contains kSCNetworkReachabilityFlagsReachable") 
}