Как объявить блок с аргументами в swift?

Нелегко выяснить, как правильно объявлять / использовать блоки с быстрым. Каким будет быстрый эквивалент следующего кода?

Благодарю.

^(PFUser *user, NSError *error) { if (!user) { NSLog(@"Uh oh. The user cancelled the Facebook login."); } else if (user.isNew) { NSLog(@"User signed up and logged in through Facebook!"); } else { NSLog(@"User logged in through Facebook!"); } 

6 Solutions collect form web for “Как объявить блок с аргументами в swift?”

Эквивалент блоков Objective-C является быстрым закрытием, поэтому он будет выглядеть следующим образом

 { (user: PFUser, error: NSError) in if (!user) { println("Uh oh. The user cancelled the Facebook login."); } else if (user.isNew) { println("User signed up and logged in through Facebook!"); } else { println("User logged in through Facebook!"); } } 

У вас есть много способов передать блок, эквивалентный функции в Swift.

Я нашел три.

Чтобы понять это, я предлагаю вам испытать на детской площадке этот маленький кусочек кода.

 func test(function:String -> String) -> String { return function("test") } func funcStyle(s:String) -> String { return "FUNC__" + s + "__FUNC" } let resultFunc = test(funcStyle) let blockStyle:(String) -> String = {s in return "BLOCK__" + s + "__BLOCK"} let resultBlock = test(blockStyle) let resultAnon = test({(s:String) -> String in return "ANON_" + s + "__ANON" }) println(resultFunc) println(resultBlock) println(resultAnon) 

Обновление: для функции Аноним есть 2 специальных случая.

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

 let resultShortAnon = test({return "ANON_" + $0 + "__ANON" }) 

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

Вот пример (объединенный с выведенной сигнатурой для отображения мощности Swift)

 let resultTrailingClosure = test { return "TRAILCLOS_" + $0 + "__TRAILCLOS" } 

В заключение:

Используя всю эту силу, я сделаю смешение закрывающего закрытия и ввода типа (с именованием для удобочитаемости)

 PFFacebookUtils.logInWithPermissions(permissions) { user, error in if (!user) { println("Uh oh. The user cancelled the Facebook login.") } else if (user.isNew) { println("User signed up and logged in through Facebook!") } else { println("User logged in through Facebook!") } } 

ИМО это красивее, чем в ObjC

Посмотрите, работает ли это для вас. Это безумие, пытаясь узнать это на второй день.

 let afterSignInAttempt: (PFUser?, NSError) -> Void = { user, error in if(!user){ NSLog("Uh oh.") } else { user.isNew ? NSLog("Signed up") : NSLog("User Logged in") } } 

Критически, если user может быть равен nil он должен быть объявлен как необязательный. Таким образом:

 { (user: PFUser?, error: NSError) -> {} in if (nil == user) ... } 

что тип user включает ? чтобы указать, что user является необязательным аргументом (либо nil либо типа PFUser ).

Другие ответы, которые не используют параметр «Дополнительно», даже не будут компилироваться.

Если вы хотите сохранить блок в переменной и вызвать его позже, проверьте этот ответ

// определить его

 class IDDBlockTime { // return time elapsed in milliseconds // static func timeSpent(_ block: (Void) -> Void) -> TimeInterval { let methodStart = Date() block() return Date().timeIntervalSince(methodStart) * 1000.0 } } 

// используй это

  let timeSpent = IDDBlockTime.timeSpent { // lines of code you want to measure // self.doSomethig() } print("timeSpent: '\(timeSpent) ms'") 
  • Прокрутка содержимого Tableview при отображении клавиатуры
  • Передача значений UIViewController в новой раскадровке - Swift
  • RxSwift Создание наблюдаемого на основе переменной
  • Делегирование протокола Objective-C на Swift
  • В чем разница между классом касания какао и нормальным классом быстрых?
  • Условное компиляция Objective-C в проекте Swift
  • Swift: ошибки при использовании разных целых размеров
  • Анимация объектов в Swift?
  • Swift, если позволяет успешно оценивать значение по умолчанию (nil)
  • Типизация в Swift
  • Как фильтровать большой массив с помощью Swift-2 для высокой производительности
  • Interesting Posts

    Основные данные, метод «сортировка по временному свойству»

    Где симулятор iPhone сохраняет базу данных sqllite

    Метод UILabel sizeToFit работает неправильно

    WebCore: рабочий: EXC_BAD_ACCESS при подключении отладчика Safari к проекту Xcode 8.3

    uiscrollview не прокручивается из-за автоотключения

    Добавляет ли веб-страницу на главный экран iPad использование UIWebView или WKWebView

    Что именно измеряет акселерометр iPhone?

    Не удалось удалить сертификат Apple WWDRC

    iPhone SDK: пользовательские элементы управления видео плеером

    Как определить, поддерживает ли пользователь iOS встроенную учетную запись Facebook перед сеансом запроса?

    Как перемещать маркер вместе с перемещением Карты Google в iOS?

    Команда MKMapViewDelegate завершилась неудачно из-за сигнала: Ошибка сегментации: 11

    Как проверить версию iOS?

    Многозадачность и SKPaymentQueue Я получаю «застрявшее» SKPaymentTransaction с транзакциейState SKPaymentTransactionStatePurchasing

    Alamofire и SwiftyJSON с Карфагеном в Xcode6.3

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.