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
を追加すればよいです。楽ですね。
まとめ
正直バイナリとか触ったことなくて不安しかないので、間違い等あればご指摘お願いします...