NSWorkspace `icon (forFileType:` возвращает значок по умолчанию - PullRequest
1 голос
/ 01 апреля 2020

Документы для NSWorkspace.shared.icon(forFileType: состояния:

/* 
 * Get the icon for a given file type.
 *
 * The file type may be a filename extension, or a HFS code encoded via NSFileTypeForHFSTypeCode, or a Universal Type Identifier (UTI).
 *
 * Returns a default icon if the operation fails.
 *
 */

// Swift
open func icon(forFileType fileType: String) -> NSImage

// Objective-C
- (NSImage *)iconForFileType:(NSString *)fileType;

Примечание:

Возвращает значок по умолчанию в случае сбоя операции.

Как определить, произошла ли операция "сбой" и возвращается ли значок по умолчанию?

Есть ли способ определить, возвращается ли значок по умолчанию без делать дорогие сравнения изображений или данных?

Ответы [ 2 ]

3 голосов
/ 10 апреля 2020

После быстрого теста, похоже, что при сбое iconForFileType каждый раз возвращается один и тот же указатель. Это имеет смысл, потому что он, вероятно, просто объединяет одну общую ссылку на это изображение «без типа файла».

Итак, вы можете получить этот указатель один раз, с известным неизвестным типом файла:

// Do this once, at program startup for example, and keep the reference
NSImage* x = [[NSWorkspace sharedWorkspace] iconForFileType:@".this_is_not_a_file_type"];

Затем просто сравните указатель:

NSImage* y = [[NSWorkspace sharedWorkspace] iconForFileType:@".xxx"];
NSLog(@"%p %p", x, y);

if (x == y)
    // `iconForFileType` failed
2 голосов
/ 12 апреля 2020

Расширение NSWorkspace для возврата nil в случае сбоя операции icon(forFileType::

extension NSWorkspace {

    func iconOptional(forFileType fileType: String) -> NSImage? {
        let icon = self.icon(forFileType: fileType)
        let iconDefault = self.icon(forFileType: "") // "Returns a default icon if the operation fails."
        return icon === iconDefault ? nil : icon
    }

}
...