Развертывание словарных значений Swift - PullRequest
0 голосов
/ 16 октября 2018

Я создаю список смежности в Swift, храня массив узлов.Однако при добавлении ребра из существующего узла мне нужно проверить, существует ли ключ from в каком-либо из дочерних элементов, и проверяет, существует ли значение to в том же самом.Кажется, что это беспорядок st

func addEdge(from: String, to: String) {
//the full code for addEdge is incomplete here
    if (children.contains{ $0.nodes[from] != nil}) {
    for child in children {
        if (child.nodes[from] != nil) {
            if (!(child.nodes[from]?.contains{$0 == to})!){
                child.nodes[from]?.append(to)
            }
        }
    }
    }
    }

Children - это

var children = [Node]()

, а Node -

class Node: Hashable {
    var nodes = [String:[String]]()
    var hashValue: Int{ return nodes.hashValue }
    static func == (lhs: Node, rhs: Node) -> Bool {
        return lhs.nodes.keys == rhs.nodes.keys
    }
}

Теперь это работает, но выглядит ужасно.Должен быть лучший способ в Swift, но что это?

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

Попробуйте что-то вроде:

if (children.contains{ $0.nodes[from] != nil}) {
    children.filter { $0.nodes[from] != nil }.
       compactMap { $0.nodes[from] }.
       filter { !($0.nodes[from]!.contains{$0 == to}) }.
       forEach { $0.nodes[from]?.append(to) }
}
0 голосов
/ 16 октября 2018

Предполагая, что вы не хотите изменять способ, которым вы реализовали вышеупомянутый код, но хотите улучшить читабельность, вы можете использовать if let и опциональную цепочку, чтобы сделать ваш код чище и более читабельным.

func addEdge(from: String, to: String) {
//the full code for addEdge is incomplete here
    if children.contains{ $0.nodes[from] != nil } {
        for child in children {
            if let fromNode = child.nodes[from], fromNode.contains{$0 == to} {
                fromNode.append(to)
            }
        }
    }
}

Свифт, опциональная цепочка

...