Swift 5: как создать набор, содержащий типы классов (для NSXPCInterface)

В документации Apple NSXPCInterface.setClasses(_:for:argumentIndex:ofReply:) для Swift описан первый параметр в виде:

Набор NSSet, содержащий объекты класса, например [класс MyObject].

Хммм, похоже, кто-то забыл обновить это с Objective-C до Swift. Для Swift я предполагаю, что это должно быть что-то вроде

Набор, содержащий типы классов

(Кто-нибудь, пожалуйста, исправьте мою формулировку.) Но как создать множество, содержащее типы классов? Компилятор не позволит мне объявить Set, типы членов которого не соответствуют Hashable. Это имеет смысл, потому что хэши необходимы для сохранения уникальности среди участников. Но типы классов в Swift, похоже, не поддаются хешированию. Попробуйте это в любом файле Swift или на игровой площадке…

class Foo {}
let mySet: Set<AnyHashable>
mySet.insert(Foo)

Компилятор жалуется:

Тип аргумента "Foo.Type" не соответствует ожидаемому типу "Hashable"

Или, в более широком смысле, кто-нибудь знает, как использовать NSXPCInterface.setClasses(_:for:argumentIndex:ofReply:) в Swift 5?


person Jerry Krinock    schedule 06.05.2019    source источник


Ответы (1)


Классы, которые вы передаете, должны быть классами @objc (и подклассами NSObject). Вы поместите их в NSSet, а затем примените к Set:

let classSet = NSSet(object: Foo.self) as! Set<AnyHashable>

Это почти наверняка ошибка в NSXPCInterface (требуется какое-то «уточнение для Swift» или, возможно, прокладка), и я предлагаю открыть дефект на bugreport.apple.com.

person Rob Napier    schedule 06.05.2019
comment
Твой обходной путь идеален, Роб. Я зарегистрировал ошибку Apple 50514123. - person Jerry Krinock; 07.05.2019