2016-05-15 3 views
1

Итак, я написал небольшую практику, которая связана с закрытием. Я пытаюсь лучше понять, как работает асинхронная концепция. Когда я пытаюсь вызвать request(), я получаю ошибки преобразования, как показано ниже:Вызов функции, которая имеет TypeAlias ​​в качестве параметра?

import UIKit 

let correctPasscode = "3EyX" 

typealias CompletionHandler = (result: AnyObject?, error: String?) -> Void 

func request(passcode: String, completionHandler: CompletionHandler) { 

sendBackRequest(passcode) {(result, error) -> Void in 
    if error != nil { 
     print(error) 
    } 
    else { 
     print(result) 

    }} 

} 

func sendBackRequest(passCode: String, completionHandler: CompletionHandler) { 
if passCode == correctPasscode { 
    completionHandler(result: "Correct. Please proceed", error: nil) 

} else { 
    completionHandler(result: nil, error: "There was an error signing in") 

} 
} 


request(correctPasscode, completionHandler: CompletionHandler) // Error happens here 

enter image description here

+0

Пожалуйста, поделитесь своим кодом, а не его изображением –

+0

Простите, только что внесли изменения. –

ответ

3

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

(result: AnyObject?, error: String?) -> Void 

Вы передаете это так:

request(correctPasscode, completionHandler:{ 
    (result: AnyObject?, error: String?) in 
    print("Inside the handler...") 
    // Do some useful things here 
}) 

или еще короче -

request(correctPasscode) { 
    (result: AnyObject?, error: String?) in 
    print("Inside the handler...") 
    // Do some useful things here 
} 

или еще короче - (типы известны через декларацию func) -

request(correctPasscode) { result, error in 
    print("Inside the handler...") 
    // Do some useful things here 
} 
+0

Или просто может опустить параметр «completeHandler» в вызове закрывающего закрытия. –

+0

@VictorSigler Право. Благодаря! – dasblinkenlight

+0

Я получаю сообщение об ошибке, когда пытаюсь вызвать запрос, чтобы сделать то, что должна делать программа. Ошибка: последовательные операторы на строке должны быть разделены символом ';'. Я в основном копировал и вставлял код, который вы мне сказали, чтобы передать параметры в request(). Может быть, я не понимаю, как работают замыкания? –

1

Я не уверен, что вы пытаетесь достичь, но эта линия:

request(correctPasscode, completionHandler: CompletionHandler) 

не компилируется, потому что вы не пропускание CompletionHandler замыкания функции, а скорее типа объекта, представляющим типа этого обработчика завершения.

Отсюда ошибка: Cannot convert value of 'CompletionHandler.*Type*'.

действительный вызов будет:

request(correctPasscode) { result, error in 
    print("result was \(result), and error was \(error)") 
} 

Но тогда ваша request функция ничего с закрытием, которое прошло в не делать это немного трудно сказать, что вы хотите ...

.
+0

Извините за двусмысленность. Все, что я делаю, отправляет этот «правильный пароль» этой функции sendBackRequest, чтобы сообщить мне, был ли код доступа правильным (я сделал его правильным кодом доступа, потому что я назначил эту переменную, в которую я прошел). –

+0

Я вижу это, но почему вы завершаете 'sendBackRequest' еще одну функцию' запрос'? Вы уже передаете закрытие 'sendBackRequest' в' request'.Какова цель (неиспользуемого) 'completeHandler' аргумента' request'? – hnh

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