Создание расширения словаря в Swift для добавления в массив как значение - PullRequest
1 голос
/ 18 июня 2020

Я пытаюсь найти красивый, чистый и общий c способ расширения словарей, чтобы я мог добавить элемент в массив, хранящийся в словаре, но без необходимости явно проверять, существует ли ключ для этой записи.

Другими словами, пусть расширение выполняет проверку ключей; если он существует, то добавьте элемент в массив, заключенный в этот ключ, если он не существует, затем создайте ключ, сохранив новый массив с этим элементом.

Код, который я сейчас использую, идет вот так:

dictionary[key] == nil ? dictionary[key] = [element] : dictionary[key]?.append(element)

Но я бы хотел написать что-то вроде:

dictionary.add(element, toArrayOn: key)

Расширение будет выглядеть примерно так:

extension Dictionary {

    mutating func add(element: SomeElement, toArrayOn key: Key) {
        // Check if self[key] exisists:
          // If self[key] != nil, check if the value is Array<SomeElement>, if so append the element to the Array, if not throw an error.
          // If self[key] == nil, make an empty Array<SomeElement> and insert the element.
        }
    }
}

Я понимаю, что это может быть немного натянуто, но мне интересно писать такого рода расширения, которые помогают очистить код. Я также начинаю догонять идею определения синтаксиса кода c, а затем выясняю, как это можно сделать. Приветствуются любые мысли по этому поводу!

1 Ответ

0 голосов
/ 18 июня 2020

Вот возможное решение. Протестировано с Xcode 11.4

extension Dictionary {

    mutating func add<T>(_ element: T, toArrayOn key: Key) where Value == [T] {
        self[key] == nil ? self[key] = [element] : self[key]?.append(element)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...