Невозможно присвоить значение типа Int типу Int? - PullRequest
1 голос
/ 30 марта 2019

Я пытаюсь найти выход count имени и фамилии в массиве a и вернуть результат как [String: Int] число с тем же ключом.

Я получаю ошибку в этой строке newResult[arg.key] = counts. Невозможно присвоить значение типа Int типу Int?

  func abbreviation(a:[String], b: [String : String]) ->[String : Int] {
        let dict = b.reduce([String : Int]()){ (result, arg) in
            var newResult = result
            let counts = a.reduce(0) { (newcount, value) -> Int in
                let count = newcount + (value.components(separatedBy:arg.value).count - 1)
                return count
            }
            return newResult[arg.key] = counts
        }
        return dict
    }

// результат

let dict = abbreviation(a:["This is chandan kumar and chandan kumar and new chandan","check chandan kumar","non ame"], b:["first":"chandan","last":"kumar"])

Ответы [ 2 ]

1 голос
/ 30 марта 2019

Вы пытаетесь вернуть результат выражения присваивания:

return newResult[arg.key] = counts

или, может быть, вы пытаетесь присвоить результат оператора return? Эта линия не имеет смысла, как вы смотрите на это. Вы должны разделить две вещи, которые вы делаете:

newResult[arg.key] = counts
return newResult

Похоже, что в этой ситуации вам следует использовать другую перегрузку метода reduce - reduce(into:_:).

Используемый в настоящее время метод reduce требует, чтобы вы каждый раз возвращали новое значение, но вы просто добавляете KVP в словарь, то есть изменяете существующее значение. Это означает, что вы создаете много копий словарей. Это хороший признак того, что reduce(into:_:) может быть лучше.

func abbreviation(a:[String], b: [String : String]) ->[String : Int] {
    // notice the parameter label "into:"
    let dict = b.reduce(into: [String : Int]()){ (result, arg) in
        let counts = a.reduce(0) { (newcount, value) -> Int in
            let count = newcount + (value.components(separatedBy:arg.value).count - 1)
            return count
        }
        result[arg.key] = counts // with reduce(into:_:), you don't return anything, just modify the first argument
    }
    return dict
}
1 голос
/ 30 марта 2019

Сообщение об ошибке сбивает с толку, и вам, возможно, придется привыкнуть воспринимать его как Swift cannot infer some types in this context.

С этой строкой:

return newResult[arg.key] = counts

Знаете ли вы, что возвращается с этим return заявлением? Это Void, также известный как пустой кортеж. (Void - это тип результата оператора присваивания в Swift.) Возможно, вы ожидали, что newResult будет результатом закрытия, но такого рода вещи не произойдут, если вы явно не напишите return newResult.

Попробуйте изменить строку на следующую:

newResult[arg.key] = counts
return newResult
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...