从NSDictionary切换到Dictionary

时间:2016-10-23 16:13:12

标签: swift dictionary nsdictionary

我有一些代码可以从文件中获取EXIF数据,但它使用NS-Types。我喜欢使Swift 3符合并使用标准的swift类型,如Dictionary或String。删除“NS”时,我收到“.value()”不存在的错误。并且编译器没有提示什么是新函数调用:

let imageSource = CGImageSourceCreateWithURL(url as CFURL, nil)
let imageProperties = CGImageSourceCopyPropertiesAtIndex(imageSource!, 0, nil)! as NSDictionary

let exifDict = imageProperties.value(forKey: "{Exif}") as! NSDictionary
let dateTimeOriginal = exifDict.value(forKey: "DateTimeOriginal") as! NSString
print ("DateTimeOriginal: \(dateTimeOriginal)")

let PixelXDimension = exifDict.value(forKey: "PixelXDimension") as! Double
print ("PixelXDimension: \(PixelXDimension)")

let exifDictTIFF = imageProperties.value(forKey: "{TIFF}") as! NSDictionary
// optional
if let Software = exifDictTIFF.value(forKey: "Software") as? NSString {
    print ("Software: \(Software)")
}

任何暗示如何改变它?

此外: 使用这个

let imageProperties = CGImageSourceCopyPropertiesAtIndex(imageSource!, 0, nil)! as Dictionary

let exifDict = imageProperties["{Exif}"] as! Dictionary

将为第二行提供错误“对成员'subScript'的模糊引用'!

1 个答案:

答案 0 :(得分:0)

所有NSDictionary都需要[String:Any]。并且所有value调用都应使用普通密钥访问。

let imageSource = CGImageSourceCreateWithURL(url as CFURL, nil)
let imageProperties = CGImageSourceCopyPropertiesAtIndex(imageSource!, 0, nil) as! [String:Any]

let exifDict = imageProperties["{Exif}"] as! [String:Any]
let dateTimeOriginal = exifDict["DateTimeOriginal"] as! String
print ("DateTimeOriginal: \(dateTimeOriginal)")

let PixelXDimension = exifDict["PixelXDimension"] as! Double
print ("PixelXDimension: \(PixelXDimension)")

let exifDictTIFF = imageProperties["{TIFF}"] as! [String:Any]
// optional
if let Software = exifDictTIFF["Software"] as? String {
    print ("Software: \(Software)")
}

这段代码很糟糕。 !的所有这些用法都是个坏主意。在此代码中应使用正确,安全的展开和铸造。