Как в Swift явно указать возвращаемое значение для карты с анонимными аргументами закрытия? - PullRequest
1 голос
/ 19 февраля 2020

Скажем, я называю map вот так, используя аргумент анонимного закрытия $0:

array.map {
  return $0.description
}

Как я могу явно определить, что карта возвращает string? Это не работает:

array.map { -> String
  return $0.description
}

Контекстный тип для списка аргументов замыкания ожидает 1 аргумент, который нельзя неявно игнорировать

Означает ли это, если я хочу указать возвращаемое значение, которое я должен назвать своими аргументами?

[РЕДАКТИРОВАТЬ: я знаю, мне не нужен явный тип возврата здесь; еще хотел бы как указать один]

Ответы [ 2 ]

4 голосов
/ 19 февраля 2020

Вы можете использовать as, чтобы определить тип анонимного вложения. В этом случае вам также необходимо указать тип ввода:

let result = array.map({ $0.description } as (CustomStringConvertible) -> String)

Примечание: В качестве типа ввода вы можете использовать любой тип из array. , Здесь я только что использовал протокол CustomStringConvertible, так как это то, что необходимо для доступа к свойству .description.

или, как вы упомянули, вы можете указать тип вывода, если вы дадите имя для входной параметр:

let result = array.map { value -> String in value.description }

Другой способ взглянуть на это - заметить, что map возвращает Array любого типа, который возвращает закрытие map. Вы можете указать, что результатом карты будет [String], и Swift будет делать вывод, что закрытие map возвращает String:

let result = array.map({ $0.description }) as [String]

или

let result: [String] = array.map { $0.description }
0 голосов
/ 19 февраля 2020

Тип будет выведен автоматически, если это строка, в противном случае вам понадобится приведение типа

array.map { String($0.description) }
...