2016-09-28 2 views
1

Следующая строка дает мне ошибку компилятора «общий параметр„KeyType“не может быть выведен»:NSMapTable «Общий параметр„KeyType“не может быть выведен»

fileprivate var delegatesMap = NSMapTable.strongToWeakObjects() 

Я пытался быть более явным, говоря :

fileprivate var delegatesMap:MapTable<Key,Value> = NSMapTable.strongToWeakObjects() 

Но я тогда Xcode не распознает «ключ»

Как я могу идти о фиксации этого?

EDIT: Я хотел бы мой ключ к типу String, и мое Значение быть типа MenuActionDelegate (класс протокола)

+0

Нет только Swift, но и я, не понимаю, что KeyType вы хотите использовать. Какие типы вы хотите использовать как KeyType и ValueType для вашего 'NSMapTable'? – OOPer

+0

Я хочу использовать строку для ключа и протокол «MenuActionDelegate» как значение –

+0

. Вам лучше включить эту информацию в свой вопрос. Я напишу короткий ответ. – OOPer

ответ

0

Вам может понадобиться, чтобы написать что-то вроде этого:

fileprivate var delegatesMap = NSMapTable<NSString, MenuActionDelegate>.strongToWeakObjects() 

В общие параметры KeyType и ValueType должны быть AnyObject, поэтому вы не можете прямо поставить String там, также вам нужно какое-то явное литье as NSString.

И значение типа MenuActionDelegate необходимо для @objc -протокола. Или же вам может понадобиться, чтобы написать что-то вроде этого:

var delegatesMap = NSMapTable<NSString, AnyObject>.strongToWeakObjects() 

И использовать его как:

let theDelegate = delegatesMap.object(forKey: "delegateName" as NSString) as! MenuActionDelegate 
+0

Это протокол класса, но я получаю сообщение об ошибке «MenuActionDelegate как конкретный тип, связанный с протоколом« AnyObject »не поддерживается» –

+0

@FaisalSyed, извините, я пропустил проверку протокола класса. Можете ли вы изменить его на '@ objc'-protocol? – OOPer

+0

Я не могу этого сделать. Как точно я бы добавил явное кастинг как NSString? Я пробовал несколько способов, но не смог сделать это правильно –

Смежные вопросы