используя функции в Swift - PullRequest
       1

используя функции в Swift

1 голос
/ 10 апреля 2019

Я новичок в программировании. Подскажите пожалуйста что не так в этом коде! Почему я получаю вывод "(Функция)"?

//first function
func admit(person: String) -> String {
  return("\(person) can go")
}
//second function
func deny(person: String) -> String {
  return("\(person) can not go")
}
//third function
func screen(onGuestList: String, person: String) -> (String) -> String {
  if onGuestList == "yes"{
    return admit(person:)
  } else {
    return deny(person:)
  }
}

var outcome = screen(onGuestList: "yes", person: "Sapinder")
print(outcome)

Я ожидаю, что вывод "(person) can go", но фактический вывод - "(Function)".

Ответы [ 2 ]

3 голосов
/ 10 апреля 2019

Почему я получаю вывод "(Функция)"?

, поскольку 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 }
1 голос
/ 10 апреля 2019

Попробуйте

func admit(person: String) -> String {
    return("\(person) can go")
}

//second function
func deny(person: String) -> String {
    return("\(person) can not go")
}

//third function
func screen(onGuestList: String, person: String) -> String {
    if onGuestList == "yes"{
        return admit(person: person)
    } else {return deny(person: person)
    }
}

var outcome = screen(onGuestList: "yes", person: "Sapinder")
print(outcome)

То, что вы делали, возвращали (String) -> String вместо String

В Swift вы можете вернуть функцию в качестве возврататип

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