2015-04-06 2 views
0

Например, возьмите этот код:Confused о том, как Swift вложенные функции работают

func jediTrainer() -> ((String, Int) -> String) { 
    func train(name: String, times: Int) -> (String) { 
    return "\(name) has been trained in the Force \(times) times" 
    } 
    return train 
} 
let train = jediTrainer() 
train("Obi Wan", 3) 

Я совершенно запутался, что происходит в этой функции. jediTrainer не принимает никаких параметров и возвращает функцию, называемую train. Когда мы говорим «train = jediTrainer()», мы теперь сохраняем «поезд» FUNCTION в переменной, называемой «train», так как она возвращает эту функцию, которая теперь хранится в переменной? Не могли бы вы сломать, что именно происходит здесь, в шагах? Спасибо огромное!

+0

Что вас пугает, так это то, что вы дали своей новой функции одноименное имя. jediTrainer не принимает никаких параметров, но возвращает функцию, которая принимает два параметра. Вы создали новую функцию с именем train, которая ведет себя точно так, как должна. –

+0

Благодарим вас за ответ. Итак, поезд VARIABLE хранит поезд FUNCTION, который вы затем можете вызвать? – rb612

+1

var может быть любым, включая функцию –

ответ

0

В Swift функции являются объектами первого класса, что означает, что функции могут ссылаться на переменные, передаваемые как параметры и возвращенные из других функций.

В вашем случае jediTrainer() возвращает функцию, которая является вложенной функцией сама по себе. Поэтому пусть поезд имеет в виду функцию train() в jediTrainer. Теперь вы можете вызвать эту функцию поезда с помощью переменной поезда.

Для получения дополнительной информации об этом, пожалуйста, обратитесь к функциям и связанным с ними темам here.

0

У вас также есть мнение об определяющих функциях внутри тел других функций. Они называются вложенными функциями. По умолчанию Вложенные функции скрыты от внешнего мира. Его все еще можно вызвать и использовать в его закрывающей функции. Функция включения также может возвращать одну из вложенных функций, что позволяет использовать вложенную функцию в другой области.

func aFunc (flag:Book)->(Int)->Int 
{ 

func plus (input:Int)->Int 
{ 
return input + 1 
} 

func minus (input:Int)->Int 
{ 
return input - 1 
} 

if (flag) 
{ 
return plus 
} 

else 
{ 
return minus 
} 
} 
Смежные вопросы