2016-09-21 12 views
2

У меня есть функция, которая возвращает определенные системные значения. Он отлично работал в Swift 2.2, и я просто обновился до Xcode 8 и Swift 3, и теперь он не работает.Преобразование NSData в NSString в Swift 3?

func ioPlatExpertDevString(_ property: String) -> String { 
    // Start tapping in to the IO Service 
    let ioPlatformExpertDevice:io_service_t? = IOServiceGetMatchingService(kIOMasterPortDefault, IOServiceMatching("IOPlatformExpertDevice")) 

    var sAnswer = "Not Found" 
    let cfAnswer:AnyObject! = IORegistryEntryCreateCFProperty(ioPlatformExpertDevice!, "\(property)" as CFString!, kCFAllocatorDefault, 0).takeRetainedValue() 
    if (cfAnswer != nil) { 
     let nsAnswer = (cfAnswer as! NSString) 
     sAnswer = nsAnswer.uppercased 
    } 

    // Close the IO Service 
    IOObjectRelease(ioPlatformExpertDevice!) 

    return sAnswer 
} 

До этого я использовал «CFData» вместо «AnyObject». Он строит хорошо, но во время выполнения, я получаю следующее сообщение об ошибке:

Could not cast value of type '__NSCFData' (0x7fff7b833ec0) to 'NSString' (0x7fff7ac32038).

+0

Для какое свойство вы называете эту функцию? –

ответ

0

Пожалуйста сделайте не типы аннотирования, если компилятор не скажет вам делать.

Например, IOServiceGetMatchingService возвращает необязательный номер io_service_t, добавочная аннотация делает его еще хуже.

IORegistryEntryCreateCFPropertyUnmanaged<CFTypeRef>! аннотация не требуется ни как интерполяция строк, так и приведение в неявное разворачивание необязательно.

CFTypeRef может быть мостом, наложенным на родной тип Swift.

Если тип возврата (NS)Data, то вряд ли он работал в предыдущих версиях.

Этот код рассматривает String и Data, если последние могут быть преобразованы в String.

func ioPlatExpertDevString(_ property: String) -> String { 
    // Start tapping in to the IO Service 
    let ioPlatformExpertDevice = IOServiceGetMatchingService(kIOMasterPortDefault, IOServiceMatching("IOPlatformExpertDevice")) 

    var sAnswer = "Not Found" 
    let cfAnswer = IORegistryEntryCreateCFProperty(ioPlatformExpertDevice, property as CFString, kCFAllocatorDefault, 0).takeRetainedValue() 
    if let cfData = cfAnswer as? Data, let answer = String(data:cfData, encoding:.utf8) { 
    sAnswer = answer.uppercased() 
    } else if let answer = cfAnswer as? String { 
    sAnswer = answer.uppercased() 
    } 
    // Close the IO Service 
    IOObjectRelease(ioPlatformExpertDevice) 
    return sAnswer 
} 
5

Заменить

let nsAnswer = (cfAnswer as! NSString) 

Для

let nsAnswer = NSString(data: cfAnswer as! Data, encoding: String.Encoding.utf8.rawValue)