Как объявить блок с аргументами в 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'") 
  • Как фильтровать большой массив с помощью Swift-2 для высокой производительности
  • WKWebview, вводящий cookie-заголовок, вызывает цикл перенаправления
  • iPad Ориентация устройства с использованием статусаBarOrientation
  • Как перенести данные, добавленные в глобальный массив swift 2
  • RxSwift Создание наблюдаемого на основе переменной
  • Как искать идентификатор Segue в раскадровке?
  • Swift: как получить значение из AutoreleasingUnsafePointer <NSString?> Из NSScanner?
  • Как создать NSmap в стиле битмакс в Swift?
  • Почему все IBOutlet (ы) найдены nil, когда viewdidload вызывается в App Delegate?
  • Swift делегат и факультативный
  • iOS Swift Animation - перемещение изображения в новое положение
  • Interesting Posts

    Доступ к файловой системе iOS без джейлбрейка?

    Почему идентификатор является общим указателем?

    Подклассификация CIFilter в Swift

    Просмотр черных полос сверху и снизу iPhone X Simulator

    Кнопка обновления iOS в контроллере View Nav Nav: перезагрузка всех таблицViewCells, созданных из разбора JSON при нажатии

    Как интегрировать Pinterest в приложение ios

    быстрая проверка, если текст пуст

    Как найти блоки Objective-C в средствах распределения или утечки

    Неопределенные символы для архитектуры arm64

    Я изучаю iOS dev и имею аварийное приложение MapKit. Нужна помощь в понимании этого аварийного журнала

    Публикация iOS Facebook с использованием Open Graph не удалась – ошибка Код 102

    Как показать виджет такой же, как виджет Alarm (Clock APP)?

    set preferredContentSize не запускает preferredContentSizeDidChangeForChildContentContainer:

    Путайте двойное бесплатное сообщение об ошибке / утечку памяти в приложении iPhone

    Рейтинг Game Center / GameKit, если сеть недоступна

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