【问题标题】:Switch from NSDictionary to Dictionary从 NSDictionary 切换到 Dictionary
【发布时间】:2016-10-23 16:13:12
【问题描述】:

我有一些代码可以从文件中获取 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' 的模糊引用”!

【问题讨论】:

  • 只需使用密钥订阅imageProperties["{Exif}"]。使用 never valueForKey 从字典中获取单个值。但要小心:据我所知,将 CGImageSourceCopyPropertiesAtIndex 转换为 Swift Dictionary 并没有奏效。但这可能会在 Swift 3 中得到修复。
  • 好的,那我该怎么办?我在 NSDictionary 上工作得很好。我喜欢有字典。
  • 字典是通用的。您必须提供一个类型,例如 Dictionary<String,Any>
  • 不会是as [String : Any],而不是as Dictionary<String,Any> 吗?
  • 是的,这就是工作(作为 [String : Any])。非常感谢。

标签: swift dictionary nsdictionary


【解决方案1】:

所有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)")
}

这段代码很糟糕。 ! 的所有这些用途都是一个坏主意。应在整个代码中使用正确、安全的展开和转换。

【讨论】:

  • 当然。这是初稿。我总是在访问之前检查 nil。
猜你喜欢
  • 2016-07-01
  • 2015-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多