#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")
}