В Swift функции могут быть названы закрытыми. Цитируя Apple documentation на закрытий:
Глобальные и вложенные функции, как и введены в функции, на самом деле являются частными случаями закрытия
Однако containsString()
является метод экземпляра (спасибо Martin R для наблюдения). Код работает, потому что instance methods in Swift are actually curried functions, которые попадают в категорию названного закрытия.
Что происходит, что "The red one.".containsString
транслируется в глобальной функции, как это:
String.containsString("The red one.")
, которая возвращает функцию (String) -> Bool
, которая заканчивается тем, что был вызван contains
, как это:
String.containsString("The red one.")("red")
String.containsString("The red one.")("green")
String.containsString("The red one.")("blue")
Теперь, с учетом подписи contains
:
public func contains(@noescape predicate: (Self.Generator.Element) throws -> Bool) rethrows -> Bool
и подпись containsString
:
public func containsString(other: String) -> Bool
мы можем видеть, что на массив строк параметр predicate
и результат String.containsString("The red one.")
совместимы: как ожидают String
в качестве аргумента и возвращает Bool
. Таким образом, компилятор может с радостью назвать функцию curried.
Замечательное замечание: я думал о C, что бы совершенно по-другому, оно проверит, содержит ли массив строк функцию, и компилятор скажет вам, что каждый раз будет возвращать false – vrwim
Два хороших ответа (и немного чтения в выходные) помогли мне понять, что происходит. Я не заметил, что функция Array.contains была перегружена: –
... ни взаимосвязь между функциями и замыканиями (и реальное значение наличия функций как «граждан первого класса» на языке). Наконец, функциональное программирование становится немного яснее. В идеале я бы ответил на оба ответа, но я собираюсь на @vrwin (только потому, что у него более низкий представитель. Гол). Спасибо, оба. –