Когда пользователь выбирает пункт меню в 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) просто связаны со строками: "Кора когтя кошки"и "Grape Holly", а не словари, которые есть в '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:)
метода.