Swiftでファイルを取扱う際、URLであればpathExtensionで拡張子を取得することができます。しかしDataからファイルの種類を特定する場合、基本機能だけでは不可能です。NSDataから判別する記事を書いている方がいたので、これを元にDataから画像の種別を特定するExtensionを作成しました。
コード全貌 (+解説)
extension Data {
enum ImageType: String, CaseIterable {
case jpg
case png
case gif
case bmp
var header: UInt8 {
switch self {
case .jpg:
return 0xff
case .png:
return 0x89
case .gif:
return 0x47
case .bmp:
return 0x42
}
}
var `extension`: String {
return "." + rawValue
}
}
var imageType: ImageType? {
var values = [UInt8](repeating: 0, count: 1)
copyBytes(to: &values, count: 1)
return ImageType.allCases.first { $0.header == values[0] }
}
}
画像ファイルの種別はバイナリデータのヘッダを見ればわかる(らしい)ので、その情報を持つenum ImageTypeを定義しておき、var imageType内で実際のヘッダとの比較を行っています。判別する画像の種類を増やしたいときはenum ImageTypeのcaseを追加すればよいです。楽ですね。
まとめ
正直バイナリとか触ったことなくて不安しかないので、間違い等あればご指摘お願いします...