Есть ли способ сделать 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:) метод.

0 ответов

Другие вопросы по тегам