Plist中的字典使用相同的键给出不一致的结果

时间:2015-09-03 15:30:05

标签: swift cocoa

受这个问题的启发:

Is there a way of getting a Mac's icon given its model number?

我正在努力获得类似的结果,但使用Mac的模型标识符作为开头,而不是Mac的型号。

但是当我使用Mac的模型标识符查找相关的系统图标时,我遇到了一个奇怪的问题。

在我的办公室机器上,我得到“iMac14,2”作为模型标识符。

当我把这个plist加载为字典时......

  

/System/Library/PrivateFrameworks/ServerInformation.framework/Versions/A/Resources/English.lproj/SIMachineAttributes.plist

...我发现它包含所有Mac机型的按键,包括“iMac14,2”,这些值包含图标的URL等。

但是,当我尝试获取标识符键(“iMac14,2”)的字典值时,我得到nil,但是如果我用文字键抓取它,我会得到实际值。

但是我从modelIdentifier函数获得的文字键和键是相同的。无论如何它看起来像......

获取模型标识符:

func modelIdentifier() -> String? {
    let service: io_service_t = IOServiceGetMatchingService(kIOMasterPortDefault, IOServiceMatching("IOPlatformExpertDevice").takeUnretainedValue())
    let cfstr = "model" as CFString
    if let model = IORegistryEntryCreateCFProperty(service, cfstr, kCFAllocatorDefault, 0).takeUnretainedValue() as? NSData {
        if let nsstr =  NSString(data: model, encoding: NSUTF8StringEncoding) {
            return String(nsstr)
        }
    }
    return nil
}

if let id = modelIdentifier() {
    println(id) // prints "iMac14,2"
}

使用此结果查找值失败:

if let dict = NSDictionary(contentsOfFile: "/System/Library/PrivateFrameworks/ServerInformation.framework/Versions/A/Resources/English.lproj/SIMachineAttributes.plist") as? [String:AnyObject] {

    if let id = modelIdentifier() {
        if let result = dict[id] as? [String:AnyObject] {
            print(result) // nil
        }
    }

}

但如果我用文字字符串做同样的事情就可以了:

if let result = dict["iMac14,2"] as? [String:AnyObject] {
    print(result)
}

result

  

[architecture:x86_64, LOCALIZABLE :{       description =“iMac with 27”宽屏LED背光显示屏,于2013年底推出。“;       marketingModel =“27”iMac(2013年末)“;       model = iMac;       processor =“四核英特尔酷睿i5,四核英特尔酷睿i7”;   },hardwareImageName:/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/com.apple.imac-unibody-27-no-optical.icns]

这里有什么问题?

字符串看起来相同但不一样?

或者我错过了其他什么?

1 个答案:

答案 0 :(得分:3)

NSDataIORegistryEntryCreateCFProperty键创建的model包含一个以NUL结尾的字符串。您将NUL包含在NSString

改为以这种方式创建字符串:

    if let nsstr = NSString(CString: UnsafePointer<Int8>(model.bytes), encoding: NSUTF8StringEncoding) {
        return String(nsstr)
    }