2016-09-21 20 views
2

私は特定のシステム値を返す関数を持っています。 Swift 2.2でうまくいきました。Xcode 8とSwift 3にアップグレードしましたが、今は失敗しています。NSDataをSwift 3のNSStringに変換しますか?

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 
} 

以前は、「AnyObject」ではなく「CFData」を使用していました。それは罰金構築しますが、実行時に、私は次のエラーを取得する:

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

+0

let nsAnswer = (cfAnswer as! NSString) 

を置き換えますか? –

答えて

0

コンパイラが行うことを教えてくれない限り、ない注釈の種類を行ってください。

たとえば、IOServiceGetMatchingServiceは、オプションではないio_service_tを返します。オプションのアノテーションはそれを悪化させます。

IORegistryEntryCreateCFProperty戻り値Unmanaged<CFTypeRef>!注釈は、文字列補間および暗黙のアンラップしたオプションのキャストと同様に必要でもありません。

CFTypeRefは、ネイティブスウィフトタイプにブリッジキャストすることができます。

戻り値の型が(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 
} 
5

あなたはその関数を呼び出しているプロパティについて

let nsAnswer = NSString(data: cfAnswer as! Data, encoding: String.Encoding.utf8.rawValue) 
関連する問題