Xcode 在Swift 3中将NSData转换为NSString?

Xcode 在Swift 3中将NSData转换为NSString?,xcode,nsstring,nsdata,swift3,Xcode,Nsstring,Nsdata,Swift3,我有一个返回某些系统值的函数。它在Swift 2.2中运行良好,我刚刚升级到Xcode 8和Swift 3,但现在它失败了 func ioPlatExpertDevString(_ property: String) -> String { // Start tapping in to the IO Service let ioPlatformExpertDevice:io_service_t? = IOServiceGetMatchingService(kIOMaster

我有一个返回某些系统值的函数。它在Swift 2.2中运行良好,我刚刚升级到Xcode 8和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”。它构建得很好,但在运行时,我得到以下错误:

无法将类型为“\uu NSCFData”(0x7fff7b833ec0)的值强制转换为“NSString”(0x7fff7ac32038)


请执行而不是注释类型,除非编译器告诉您这样做

例如,
IOServiceGetMatchingService
返回一个非可选的
io\u服务\u t
,您的可选注释会使情况变得更糟

IORegistryEntryCreateCFProperty
返回
非托管也不需要注释,字符串插值和强制转换为隐式展开也是可选的

CFTypeRef
可以桥铸为本机Swift类型

如果返回类型是
(NS)Data
,则它不太可能在以前的版本中工作

如果可以将
字符串
数据
转换为
字符串
,则此代码将考虑这些数据

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
}

更换

let nsAnswer = (cfAnswer as! NSString) 

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

有关最新版本的Swift:

String(decoding: data, as: UTF8.self)

您为哪个属性调用该函数?