Почему я получаю вывод "(Функция)"?
, поскольку screen
функция , а не , возвращающая String
, вместо нее возвращается (String) -> String
.
Проще говоря, исправить это - реализовать screen
как:
func screen(onGuestList: String, person: String) -> String {
if onGuestList == "yes"{
return admit(person: person)
} else {
return deny(person: person)
}
}
так в чем здесь разница? Ну, во-первых, теперь он возвращает строку вместо функции, которая принимает строку и возвращает строку. Также для вызова admit
и deny
необходимо упомянуть метку (person
), чтобы передать им параметр.
Несвязанный совет:
func screen(onGuestList: String, person: String) -> String {
return onGuestList == "yes" ? admit(person: person) : deny(person: person)
}
предпочтительно, попробуйте назвать функции глаголами, а не существительными, мы обычно делаем это для свойств (полей), но не для методов (поведения). Например: displayScreen
вместо screen
.
Так что означает возвращение (String) -> String
?
Вкратце, Свифт допускает такую вещь. Рассмотрим следующий пример:
func sayHello() -> (String) -> String {
let functionToReturn: (String) -> String = { name in
return "Hello \(name)"
}
return functionToReturn
}
func takeMy(function: (String) -> String, name: String) {
print("I am about to print the function:")
print(function(name))
}
takeMy(function: sayHello(), name: "Sappie")
// I am about to print the function:
// Hello Sappie
Как видите, функция takeMy
принимает другую функцию в качестве параметра типа (String) -> String
, поэтому мы передали ей sayHello()
, поскольку ее сигнатура соответствует типу параметра.
В качестве примера из реальной жизни вы можете найти множество методов, параметры которых являются функциями при работе с коллекциями (например). Например, метод filter
:
func returnMoreThanfive(element: Int) -> Bool {
return element > 5
}
let array = [1,2,3,4,5,6,7,8,9]
let filteredArray = array.filter(returnMoreThanfive)
// [6, 7, 8, 9]
мы передали filter
функцию, которая принимает элемент и возвращает логическое значение. Имейте в виду, что это всего лишь пример, чтобы сделать его более понятным для вас, однако мы обычно делаем так:
let filteredArray = array.filter { $0 > 5 }