Вы можете избежать принудительного понижения и для безопасной проверки типа элементов в CFArray
, возвращаемых CNCopySupportedInterfaces
, путем условного приведения каждого элемента к String
, а затем к CFString
в вашем вызове CNCopyCurrentNetworkInfo
.
func fetchSSIDInfo() -> String? {
var ssid: String?
if let interfaces = CNCopySupportedInterfaces() as NSArray? {
for cfInterface in interfaces {
guard let interface = cfInterface as? String else {
continue
}
if let interfaceInfo = CNCopyCurrentNetworkInfo(interface as CFString) as NSDictionary? {
ssid = interfaceInfo[kCNNetworkInfoKeySSID as String] as? String
break
}
}
}
return ssid
}
Условное приведение возвращаемого значения от CNCopySupportedInterfaces
к [CFString]
позволяет избежать принудительного понижения, но не позволяет безопасно проверять тип элементов в массиве. Например, следующий фрагмент будет скомпилирован, но при выполнении выдает исключение NSException.
let cfArray = [1 as CFNumber, 2 as CFNumber] as CFArray
if let arrayOfStrings = cfArray as? [CFString] {
for e in arrayOfStrings {
print((e as String).appending("foo"))
}
}