Есть ли способ сделать NSMenuItem представляющим словарь в Swift?
Когда пользователь выбирает пункт меню в NSPopUpButton, я хочу, чтобы этот элемент представлял словарь, а не только его значение String, но все равно отображал String. Я создал цикл for-in для сравнения словарей, но я хочу сравнить только те словари, которые выбраны в разных NSPopUpButton.
Я пытался создать массив выбранных элементов, как это:
var selection = [listOne!.selectedItem!, listeTwo!.selectedItem!, listThree!.selectedItem!, listFour!.selectedItem!, listFive!.selectedItem!]
И я установил 'selection' в качестве цели цикла for-in. Но, конечно, это не работает, потому что я создал массив типа NSMenuItem, и я хочу использовать свой цикл со словарями, которые представлены элементами меню, а не с самим элементом меню. На данный момент мои пункты меню отображают свои строковые значения, но мне также нужно, чтобы они представляли словари, которые связаны с ними. Так как я могу это сделать? Я пробовал много способов, но ни один из них не работал.
Вот мои словари и декларация моих двух компонентов:
var ingredientListMettinaCommon = [
catClawBark: ["Resist Lightning": 5, "Resist Damage": 8],
grapeHolly: ["Resist Poison": 6, "Resist Damage": 2]
]
var catClawBark = "Cat's Claw Bark"
var grapeHolly = "Grape Holly"
Вот строка кода, которая заполняет мое всплывающее меню:
listOne.addItems(withTitles: Array(ingredientListMettinaCommon.keys))
И вот мой цикл:
for (ingredient, keys) in selection { //Error : "Expression type '[NSMenuItem]' is ambiguous without more context"
for key in keys {
for (ingredient2, keys2) in selection {
for key2 in keys2 {
if ingredient != ingredient2 {
if key.key == key2.key {
result = "You created a potion !\n---> \(key.key) \(key.value + key2.value) <---"
}
else {
result = "No match. Check the ingredients selected or retry when you have more !"
}
}
}
}
}
}
Так что на самом деле это не работает, потому что мои пункты меню (catClawBark и grapeHolly) просто связаны со строками: "Коготь кошачьего когтя" и "Виноградный падуб", а не со словарями, содержащимися в "componentListMettinaCommon", поэтому я хочу найти решение,
РЕДАКТИРОВАТЬ: Благодаря @vadian проблема почти решена, но я все еще получаю некоторые ошибки, которые я не могу решить самостоятельно. Вместо использования addItems(withTitles:)
метод, я положил этот цикл:
for (ingredient, effect) in ingredientListMettinaCommon {
let menuItem = listOne.addItem(withTitle: ingredient);
menuItem.representedObject = [ingredient: effect] //ERROR on 'menuItem'
}
Но я получаю ошибку: Value of tuple type 'Void' has no member 'representedObject'
Постоянная menuItem
Предполагается, чтобы иметь тип Void из-за addItem(withTitle:)
метод.