2016-11-07 3 views
1

Q: Возможно ли передать функцию в качестве аргумента функции в Swift 3?Как установить функцию как аргумент функции в Swift 3

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

let deleteButton = MIAlertController.Button(title: "cancel", 
              type: .cancel, 
              config: getDestructiveButtonConfig(), 
              action: { 
               print("completed") 
              }) 

Что бы я хотел сделать, это нечто вроде создания глобальной функции с функцией в качестве аргумента.

MyGlobalStuff.swift 
... 
func getButton(_ myFunc: func, _ title: String) { 
    let deleteButton = MIAlertController.Button(title: title, 
              type: .cancel, 
              config: getDestructiveButtonConfig(), 
              action: { 
               myFunc // call here the function pass by argument 
              }) 
} 

Вызывается getButton(..) с переданной функции в пределах того же класса.

MyViewController.swift 
... 
getButton(myPrintFunc, "cancel") 

func myPrintFunc() { 
     print("completed") 
} 

Возможно ли это? Помощь очень ценится.

+3

Вы ищете это? 'Типы функций в качестве типов параметров' в https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Functions.html – Santosh

+0

@Santosh ваша ссылка не охватывает мой вопрос. я не ищу закрытие или возвращаемые значения –

+0

ну. на самом деле мне нужно было закрыть ... Клянусь, я уже пробовал. не работал. попробовал это снова после ответов, работал ... мой плохой.thank youf или ваше время –

ответ

7

Да ты может передавать функцию/замыкание в качестве параметра другой функции.

Это синтаксис

func doSomething(closure:() ->()) { 
    closure() 
} 

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

Вы можете позвонить DoSomething с этим синтаксисом

doSomething(closure: { _ in print("Hello world") }) 

или с помощью закрывающего трейлинг синтаксис

doSomething { 
    print("Hello world") 
} 
+0

закрытие не работает, потому что тогда этот код будет вызван в момент вызова функции getButton, а не после нажатия кнопки –

+2

@DavidSeek, почему он будет выполнен в тот момент, когда была вызвана функция getButton? – user28434

+0

если у меня есть замыкание в getButton, он будет вызван в момент завершения функции. но мне нужно, чтобы он вызывается, как только кнопка была нажата. –

2

Функции первого класса в стрижа, так что вы можете передать их следующим образом:

func getButton(_ myFunc:() -> Void, _ title: String) { 

Вы должны указать сигнатуру функции в типе, т.е. типы параметров и тип возвращаемого значения

+0

спасибо, ваш подход работал так же хорошо, как appzYourLife's. давая ему галочку, потому что он был быстрее. upvote для вашего времени и помощи. спасибо –

4

Предполагая, что

typealias Func =() -> Void  

Вы можете сделать:

func getButton(_ title: String, _ myFunc: Func) { 
    let deleteButton = MIAlertController.Button(title: title, 
               type: .cancel, 
               config: getDestructiveButtonConfig(), 
               action: { 
                myFunc() 
               }) 
} 

Или даже:

func getButton(_ title: String, _ myFunc: Func) { 
    let deleteButton = MIAlertController.Button(title: title, 
               type: .cancel, 
               config: getDestructiveButtonConfig(), 
               action: myFunc 
               ) 
} 

Кроме того, если вы не заметили, я переехал закрытия в конце списка параметров. Таким образом, это позволит передовые магии, как:

getButton("X") { … } 

вместо

getButton({ … }, "X") 
+0

uh. Мне нравятся типы. Спасибо! повышать для этого –

Смежные вопросы