在Swift 3中将NSData转换为NSString?

3
我有一个返回某些系统值的函数。在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”,它可以成功构建,但在运行时出现以下错误:

无法将类型为 '__NSCFData' (0x7fff7b833ec0) 的值转换为类型为 'NSString' (0x7fff7ac32038)。


你正在调用哪个属性的函数? - Martin R
3个回答

5

替换

let nsAnswer = (cfAnswer as! NSString) 

To

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

1

对于更近期的Swift版本:

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

0
请不要在编译器没有提示的情况下注释类型。
例如,IOServiceGetMatchingService 返回一个非可选的 io_service_t,你的可选注释会使它更糟糕。 IORegistryEntryCreateCFProperty 返回 Unmanaged<CFTypeRef>!,也不需要注释,以及字符串插值和隐式解包可选项的转换。 CFTypeRef 可以桥接转换为本地 Swift 类型。
如果返回类型是 (NS)Data,那么它在之前的版本中很少能够工作。
此代码考虑了 StringData,如果后者可以转换为 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
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接