2016-10-23 9 views
1

ファイルからEXIFデータを取得するコードがありますが、NSタイプが使用されています。私はSwift 3に準拠させ、DictionaryやStringのような標準的な高速タイプを使用するのが好きです。 "NS"を削除すると、 "。value()"が存在しないというエラーが表示されます。新しい関数呼び出しとは何か、コンパイラによるヒントはありません。NSDictionaryからDictionaryに切り替える

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 

+1

キーサブスクリプション 'imageProperties [" {Exif} "]'を使用してください。辞書から単一の値を取得するには、 'valueForKey'を使用しないでください。しかし注意してください: 'CGImageSourceCopyPropertiesAtIndex'を' Dictionary'を動かすようにキャストすることは、私が覚えている限り動作しませんでした。しかし、これはSwift 3で修正される可能性があります。 – vadian

+0

Ok、どうすればいいですか?私はNSDictionaryでうまく動作します。そして私は辞書を持っているのが好きです。 – Peter71

+0

辞書は一般的なものです。あなたは 'Dictionary ' – vadian

答えて

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

このコードはひどいです。 !のこれらの用途はすべて悪い考えです。このコードでは、適切かつ安全なアンラッピングとキャスティングを使用する必要があります。

+0

これが最初のドラフトでした。私はアクセスする前に常にnilをチェックします。 – Peter71

関連する問題