Как проверить битовые поля (в частности, флаги SCNetworkReachabilityFlags) на наличие флагов в Swift?

#ios #swift #bit-fields #bitmask

#iOS #swift #битовые поля #битовая маска

Вопрос:

У меня есть SCNetworkReachabilityFlags переменная, и я хочу проверить ее на наличие определенных значений, например, доступна ли сеть через WWAN.

SCNetworkReachabilityFlags Тип — это typealias for UInt32 , а различные параметры определены как Int переменные.

Используя Objective-C, вы могли бы сделать следующее:

 if (flags amp; kSCNetworkReachabilityFlagsIsWWAN) {
 // do stuff
}
  

В Swift, если я попробую это:

 if reachabilityFlags amp; kSCNetworkReachabilityFlagsIsWWAN {
 // do stuff
}
  

вы получаете ошибку компилятора: Could not find an overload for 'amp;' that accepts the supplied arguments .

Я прочитал несколько других вопросов, где параметры битового поля определены как RawOptionSet структура. Этого не было сделано в SCNetworkReachability .

Как проверить наличие флагов в Swift?

Ответ №1:

На самом деле эта ошибка связана не с аргументами вашей проверки флагов, а с возвращаемым значением. if Оператор ожидает логическое значение (или, по крайней мере, что-то, соответствующее Logical ), но amp; оператор для двух Int значений возвращает Int . Вам просто нужно сравнение в вашем if заявлении:

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

Поскольку SCNetworkReachabilityFlags и константы (как ни странно) разных типов, вам нужно будет выполнить некоторое приведение, чтобы сравнение сработало:

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