Есть ли способ получить Все из разные типы расширения UTType как строки? Мне они нужны специально для изображений, аудио и видео.

Я следил за этим ответом, но он не дает мне всех расширений

var types = [String]()

let utiTypes = [kUTTypeImage, kUTTypeMovie, kUTTypeVideo, kUTTypeMP3, kUTTypeAudio, kUTTypeQuickTimeMovie, kUTTypeMPEG, kUTTypeMPEG2Video, kUTTypeMPEG2TransportStream, kUTTypeMPEG4, kUTTypeMPEG4Audio, kUTTypeAppleProtectedMPEG4Audio, kUTTypeAppleProtectedMPEG4Video, kUTTypeAVIMovie, kUTTypeAudioInterchangeFileFormat, kUTTypeWaveformAudio, kUTTypeMIDIAudio, kUTTypeLivePhoto, kUTTypeTIFF, kUTTypeGIF, kUTTypeQuickTimeImage, kUTTypeAppleICNS]

for type in utiTypes {
            
    let str = String(type)
            
    guard let utiStr = fileExtension(for: str) else { continue }

    types.appent(utiStr)
}

dump(types)

Результаты

15 elements // there are really 21 types
  - "jpeg"
  - "png"
  - "mov"
  - "mpg"
  - "m2v"
  - "ts"
  - "mp3"
  - "mp4"
  - "mp4"
  - "avi"
  - "aiff"
  - "wav"
  - "midi"
  - "tiff"
  - "gif"

Проблема здесь в том, что он не возвращает таких значений, как qt или jpg. Например, я использую UIDocumentPickerViewController, и когда я выбираю изображение, возвращаемое расширение пути URL-адреса равно jpg, а не jpeg. Если бы я хотел узнать, был ли возвращенный URL-адрес изображением, и сравнил его pathExtension с массивом types выше, он бы сказал, что его нет в списке.

0
Lance Samaria 24 Ноя 2021 в 23:02
Я не могу воспроизвести ваш результат на игровой площадке. Я даже не получаю "jpeg" или "png".
 – 
Sweeper
24 Ноя 2021 в 23:53
Это странно? вы импортировали MobileCoreServices?
 – 
Lance Samaria
24 Ноя 2021 в 23:55

1 ответ

Лучший ответ

Ты можешь сделать:

import UniformTypeIdentifiers

let utiTypes = [UTType.image, .movie, .video, .mp3, .audio, .quickTimeMovie, .mpeg, .mpeg2Video, .mpeg2TransportStream, .mpeg4Movie, .mpeg4Audio, .appleProtectedMPEG4Audio, .appleProtectedMPEG4Video, .avi, .aiff, .wav, .midi, .livePhoto, .tiff, .gif, UTType("com.apple.quicktime-image"), .icns]

print(utiTypes.flatMap { $0?.tags[.filenameExtension] ?? [] })

Всего существует 33 расширения файлов для UTTypes, которые вы указали, когда я запускаю этот код на игровой площадке. Обратите внимание, что некоторые UTTypes, которые вы указали, не имеют связанных с ними расширений имен файлов, вероятно, потому, что они слишком "общие" (например, "изображение" и "видео"). Некоторые типы UTTypes имеют несколько расширений имен файлов, а некоторые могут совпадать с расширениями имен файлов других типов UTTypes.

В выводе нет файлов «jpg» или «png». Чтобы увидеть их появление, вам нужно будет использовать этот список:

// I've also removed the types that have no file name extensions
let utiTypes = [
    UTType.jpeg,
    .png,
    .mp3,
    .quickTimeMovie,
    .mpeg,
    .mpeg2Video,
    .mpeg2TransportStream,
    .mpeg4Movie,
    .mpeg4Audio,
    .appleProtectedMPEG4Audio,
    .avi,
    .aiff,
    .wav,
    .midi,
    .tiff,
    .gif,
    UTType("com.apple.quicktime-image"),
    .icns
]

Используя приведенный выше список, вывод для меня:

jpeg
jpg
jpe
png
mp3
mpga
mov
qt
mpg
mpeg
mpe
m75
m15
m2v
ts
mp4
mpg4
mp4
mpg4
m4p
avi
vfw
aiff
aif
wav
wave
bwf
midi
mid
smf
kar
tiff
tif
gif
qtif
qti
icns

Также обратите внимание, что если вы хотите получить UTType из расширения имени файла, вы можете просто сделать:

let type = UTType(tag: "jpg", tagClass: .filenameExtension, conformingTo: nil)

И проверьте, является ли расширение имени файла, например, изображение, выполнив:

type?.isSubtype(of: .image)

Однако имейте в виду, что файл не обязательно представляет собой изображение только потому, что его имя говорит, что это так :)

1
Sweeper 24 Ноя 2021 в 23:59
Я обновил список UTTypes, который дает вам "jpg" и "png".
 – 
Sweeper
25 Ноя 2021 в 00:00
Спасибо, это сработало. О том, что вы сказали в своем ответе. Почему это не изображение, в расширении файла указано изображение? Подойдет ли это также для .movie?
 – 
Lance Samaria
25 Ноя 2021 в 00:02
Для UTTypes iOS 14 есть UTType.movie, UTType.video, UTType.audio, .rawVideo, .liveVideo. Применимо ли это к этому значению только потому, что в нем говорится, что видео и фильм, не означает, что это видео или фильм?
 – 
Lance Samaria
25 Ноя 2021 в 00:04
1
В конце концов, это просто имя файла. Я могу изменить его на все, что захочу, независимо от содержимого файла. Я могу полностью создать текстовый файл и назвать его cat.png. По сути, я говорю то же самое, что и предупреждение в документации здесь . Вы также должны использовать другую метрику для определения типа файла, если это возможно, иначе вы не можете быть уверены на 100%.
 – 
Sweeper
25 Ноя 2021 в 00:07
Аааааааааааааааааааааааааааа 100% в правде, я это не заметил. Спасибо за совет :)!!! Есть ли у вас какие-либо ссылки SO, которые я могу использовать для проверки самого фактического содержимого?
 – 
Lance Samaria
25 Ноя 2021 в 00:08