2014-07-03 15 views
5

Ho una variabile SCNetworkReachabilityFlags e voglio verificarla per valori particolari, ad es. se la rete è raggiungibile tramite WWAN.Come controllare i bitfield (SCNetworkReachabilityFlags in particolare) per i flag in Swift?

Il tipo SCNetworkReachabilityFlags è un typealias per UInt32 e le varie opzioni sono definiti come Int variabili.

Utilizzando Objective-C si potrebbe procedere come segue:

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

In Swift se provo questo:

if reachabilityFlags & kSCNetworkReachabilityFlagsIsWWAN { 
// do stuff 
} 

si ottiene un errore di compilazione: Could not find an overload for '&' that accepts the supplied arguments.

Ho letto alcune altre domande in cui le opzioni bitfield erano definite come una struct RawOptionSet. Questo non è stato fatto in SCNetworkReachability.

Come verificare le bandiere in Swift?

risposta

4

Questo errore si sta effettivamente lamentando non degli argomenti del controllo flags, ma del valore restituito. Una dichiarazione if prevede un valore booleano (o almeno qualcosa conforme a Logical), ma l'operatore & per due valori Int restituisce un valore Int. Hai solo bisogno di un confronto in if dichiarazione:

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

Dal SCNetworkReachabilityFlags e le costanti sono (stranamente) di diversi tipi, è necessario fare un po 'di fusione per rendere il lavoro di confronto:

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