2014-07-03 9 views
5

Mam zmienną SCNetworkReachabilityFlags i chcę ją sprawdzić pod kątem konkretnych wartości, np. jeśli sieć jest dostępna za pośrednictwem sieci WWAN.Jak sprawdzić pola bitowe (w szczególności SCNetworkReachabilityFlags) dla flag w Swift?

Typ SCNetworkReachabilityFlags jest typealias dla UInt32 i różne opcje są definiowane jako Int zmiennych.

Korzystanie z Objective-C można wykonać następujące czynności:

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

w Swift gdy próbuję to:

if reachabilityFlags & kSCNetworkReachabilityFlagsIsWWAN { 
// do stuff 
} 

masz błąd kompilatora: Could not find an overload for '&' that accepts the supplied arguments.

Przeczytałem kilka innych pytań, gdzie opcje bitfield, gdzie zdefiniowano jako struct RawOptionSet. Nie zostało to zrobione w SCNetworkReachability.

Jak sprawdzić flagi w Swift?

Odpowiedz

4

Ten błąd w rzeczywistości nie narzeka na argumenty sprawdzania flag, ale na zwracaną wartość. Instrukcja if oczekuje wartości boolowskiej (lub co najmniej zgodnej z Logical), ale operator & dla dwóch wartości Int zwraca wartość Int. Wystarczy porównanie w swoim oświadczeniu if:

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

Od SCNetworkReachabilityFlags i stałe są (o dziwo) różnych rodzajów, trzeba zrobić odlew aby uczynić pracę porównania:

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