Цикл работает, выдает ошибку при попытке уменьшить карту - PullRequest
0 голосов
/ 04 мая 2018

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

У меня работает этот код:

var str = "Geometry add to map: "
for element in geometryToAdd {
     str.append(element.toString())
}
print(str)

Теперь я хотел поиграть с уменьшением карты, так как недавно узнал об этом. Я переписал это так:

print(geometryToAdd.reduce("Geometry add to map: ", {$0.append($1.toString())}))

Это дает мне ошибку error: MyPlayground.playground:127:57: error: type of expression is ambiguous without more context. Что я делаю не так?

var geometryToAdd: Array<Geometry> = []

и класс Geometry имеет функцию toString.

Спасибо за любую помощь.

Ответы [ 3 ]

0 голосов
/ 04 мая 2018

Есть два похожих метода:

func reduce<Result>(_ initialResult: Result, _ nextPartialResult: (Result, Element) throws -> Result) rethrows -> Result
func reduce<Result>(into initialResult: Result, _ updateAccumulatingResult: (inout Result, Element) throws -> ()) rethrows -> Result

Вы используете первую версию, где $0 является неизменным и закрытие должен вернуть накопленное значение. Это не компилируется, потому что append() изменяет свой получатель.

Использование второй версии приводит к компиляции: здесь $0 является изменяемым и закрытие обновляется $0 с накопленным значением.

print(geometryToAdd.reduce(into: "Geometry add to map: ", {$0.append($1.toString())}))
0 голосов
/ 04 мая 2018

Вам лучше использовать joined(separator:) вместо уменьшения. Он имеет лучшую производительность и позволяет установить разделитель, если вы хотите:

print("Geometry add to map: \(geometryToAdd.map(String.init).joined(separator: "")")
0 голосов
/ 04 мая 2018

Сделайте это менее двусмысленным:

print(geometryToAdd.reduce("Geometry add to map: ", {
      $0 + $1.toString()
}))

Ошибка возникает из-за того, что вы можете только append() к последовательности переменных: $0 является неизменным String. В цикле str был изменяемым: var, а не let.

Посмотрите на подпись reduce

func reduce<Result>(_ initialResult: Result, _ nextPartialResult: (Result, Element) throws -> Result) rethrows -> Result

nextPartialResult - это функция / замыкание, которая принимает два аргумента и дает результат. Аргументы этой функции неизменны, они не являются inout параметрами. Только inout параметры могут быть изменены.

Подробнее об неизменяемости параметров функции здесь :

Параметры функции по умолчанию являются константами. Пытаясь изменить значение параметра функции изнутри тела этой функции приводит к ошибке времени компиляции.

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