Есть ли способ сделать NSMenuItem представляющим словарь в Swift? - PullRequest
0 голосов
/ 20 декабря 2018

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

...