Неоднозначное использование ошибки компилятора префикса в Swift 3

Я только что перенес свой проект со Swift 2.2 на Swift 3.0 с бета-версией Xcode 8.

У меня есть что-то похожее на следующий код (вы можете вставить его на игровую площадку):

import Foundation

let datesWithCount: [(Date, Int)] = [(Date(), 1), (Date(), 2), (Date(), 3)]

let dates: [Date] = datesWithCount.sorted {
    $0.0 < $1.0
}.prefix(1).map {
    return $0.0
}

В Swift 2.2 это скомпилировано нормально. Однако с Swift 3.0 я получаю сообщение об ошибке

Неоднозначное использование «префикса»

Единственный способ скомпилировать это в Swift 3.0 — разделить карту на отдельную строку:

let sortedDatesWithCount = datesWithCount.sorted {
    $0.0 < $1.0
}.prefix(1)

let mappedDates = sortedDatesWithCount.map {
    return $0.0
}

Кстати, в реальном коде я возвращаю NSNotification объектов из map, а не Date, но ошибка та же. Я просто использовал Date здесь, чтобы упростить пример.

Есть ли способ заставить это скомпилировать как один вкладыш?

ОБНОВЛЕНИЕ: Создан JIRA для проекта Swift.


person mluisbrown    schedule 20.06.2016    source источник


Ответы (1)


Это работает, если вы превращаете ArraySlice в массив перед передачей его в map:

let dates: [Date] = Array(datesWithCount.sorted {
    $0.0 < $1.0
}.prefix(1)).map { return $0.0 }

Это похоже на ошибку определения типа в компиляторе.

person Eric Aya    schedule 20.06.2016
comment
Дата соответствует протоколу Сопоставимо в Swift 3. sorted { $0.0 < $1.0 } должно быть достаточно - person Leo Dabus; 21.06.2016
comment
Спасибо, я не знал. Это очень хорошая новость! // Я просто использую код OP, и они говорят, что Date в любом случае просто пример. :) - person Eric Aya; 21.06.2016
comment
Мне тоже кажется, что это ошибка вывода типа. Я собираюсь сообщить об этом как таковой. @LeoDabus спасибо за совет о сортировке дат. Настоящий код также сортирует даты. Бит примера возвращает даты с карты. - person mluisbrown; 21.06.2016
comment
Вопрос и ответ Эрика обновлены до более короткого синтаксиса сортировки :) - person mluisbrown; 21.06.2016
comment
@mluisbrown Я сталкиваюсь с этой же проблемой в нескольких местах своего кода, где значение, которое я prefixing равно [SomeClass] — вы нашли что-нибудь еще об этой проблеме (я не могу использовать вышеуказанный обходной путь)? - person Blixt; 09.09.2016
comment
@Blixt Если вы не можете использовать это решение, это означает, что ваша проблема имеет некоторые особенности, о которых мы должны знать, прежде чем сможем помочь - я предлагаю вам опубликовать новый вопрос. :) - person Eric Aya; 09.09.2016
comment
@EricAya Дело в том, что моя функция уже возвращает [Type], поэтому я не могу выполнить .prefix(…) раньше. Поскольку это похоже на ошибку (воссоздание простого примера в Playground не показывает проблему), меня больше всего интересует информация @mluisbrown. - person Blixt; 09.09.2016
comment
Один из случаев, когда я сталкиваюсь с этим: twitter.com/blixt/status/774268313673273344 - person Blixt; 09.09.2016
comment
Для справки в будущем: я обнаружил проблему, созданную @mluisbrown (bugs.swift.org/browse/SR -1856), и причиной этой ошибки является то, что происходит после .prefix(...), поэтому решение на самом деле состоит в том, чтобы просто убедиться, что вызов prefix является последним (при необходимости разбить на несколько переменных ). - person Blixt; 09.09.2016
comment
SR-1856 исправлен, исходный код компилируется с Swift 4.1 (бета) - person Martin R; 23.03.2018