Тип выражения '()' неоднозначен без дополнительного контекста для XCTAssertEqual - PullRequest
0 голосов
/ 21 ноября 2018

Я вижу ошибку Expression type '()' is ambiguous without more context при вызове метода теста XCTAssertEqual.Я пытался явно добавить [(Character,Int)] к expected, но все еще вижу эту ошибку.Я не уверен, что еще попробовать.

Как мне понять, как работает быстрый компилятор?

ТЕСТ:

func testFrequencyCountOnInput() {
    let huff = Huffman("ANNA")
    let expected: [(Character,Int)] = [("A", 2), ("N", 2)]
    XCTAssertEqual(huff.frequency, expected)
}

КОД:

class Huffman {
    private(set) var frequency: [(Character, Int)]

    init(_ input: String) {
        self.frequency = Huffman.sortedFrequency(for: input)
    }

    static private func sortedFrequency(for input: String) -> [(Character, Int)] {
        var frequency = [Character: Int]()
        for char in input {
            frequency[char] = (frequency[char] ?? 0) + 1
        }
        let sorted = Array(frequency).sorted(by: {$0.1 > $1.1})
        return sorted
    }
}

1 Ответ

0 голосов
/ 21 ноября 2018

Я думаю, что использование Tuple не очень хорошая идея.Вместо этого вы можете изменить его на какой-то тип.Например:

struct Frequency: Equatable {
    let char: Character
    let count: Int
}

Struct хорошо, это тип значения (как Tuple), и может автоматически синтезировать соответствие Equatable протоколу .

Следующим шагом является класс Huffman.Для такой крошечной проблемы у вас есть тонна кода.Давайте попробуем также изменить его:

final class Huffman {
    private(set) var frequency: [Frequency]

    init(_ input: String) {
        frequency = input.counts
            .map { Frequency(char: $0.key, count: $0.value) }
            .sorted(by: { $0.count > $1.count })
    }
}

extension String {
    var counts: [Character: Int] {
        return reduce(into: [:]) { d, c in
            d[c] = d[c, default: 0] + 1
        }
    }
}

Обратите внимание, этот код вычисляет частоту в свойстве String расширения counts (возможно, не в лучшем названии), затем map приводит к [Frequency] инаконец, сортировка это не большая проблема.Гораздо меньше кода и больше точности.
И здесь мы проведем наш единственный тест:

func testFrequencyCountOnInput() {
    let huff = Huffman("ANNNA")
    let expected: [Frequency] = [
        Frequency(char: "N", count: 3),
        Frequency(char: "A", count: 2)
    ]
    XCTAssertEqual(huff.frequency, expected)
}

Все отлично работает, даже функция sort.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...