Swift 5: Как создать набор, содержащий типы классов (для NSXPCInterface) - PullRequest
1 голос
/ 06 мая 2019

В документации 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?

1 Ответ

2 голосов
/ 06 мая 2019

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...