Синтаксис блока в Swift

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

Вот упрощенный пример в Objective-C Я написал:

[UIView animateWithDuration:10.0 animations:^{self.navigationController.toolbar.frame = CGRectMake(0,10,0,10);}];

Как написать это в Swift?

Это автозаполнение шаблона дает:

UIView.animateWithDuration(duration: NSTimeInterval, animations: (() -> Void))

Ответ 1

Поскольку ожидаемые типы аргументов и возвращаемый тип для аргумента анимации известны, компилятор может вывести их без проблем. Это должно сработать (хотя на данный момент у меня нет доступной игровой площадки:

UIView.animateWithDuration(10.0, animations: {
  self.navigationController.toolbar.frame = CGRect(x:0.0, y:10.0, width:10.0, height:0.0)
})

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

обратите внимание на CGRect() - документы разработчика, которые показывают CGRect() в быстром коде. Возможно, это требует импорта?

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

UIView.animateWithDuration(10.0) {
  self.navigationController.toolbar.frame = CGRect(x:0.0, y:10.0, width:10.0, height:0.0)
}

Ответ 2

Это быстрый формат закрытия:

{(parameter:type, parameter: type, ...) -> returntype in
    //do stuff  
}

Это то, что вы должны сделать:

//The animation closure will take no parameters and return void (nothing).
UIView.animateWithDuration(duration: NSTimeInterval, animations: {() -> Void in
    //Animate anything.
})

Здесь documentation для закрытия.

Ответ 3

Следующий код может помочь написать собственный блок.

class func testFunc(completion: ((list : NSArray!) -> Void)?) {
    //---  block code.
    if completion! != nil {
        completion! (list: NSArray())
    }
}

и вы можете называть его как -

className.testFunc {
(list: NSArray!) -> Void in
}

Ответ 4

В принципе вы можете записать его тремя одинаковыми способами:

напишите, что делать прямо в блоке закрытия/кода:

UIView.animateWithDuration(10.0) {
  self.navigationController.toolbar.frame = CGRect(x:0.0, y:10.0, width:10.0, height:0.0)
}

Это также известно как замыкающее закрытие (вы можете делать только закрытие замыкания, если параметр закрытия является последним параметром)

Это не означает, что параметр "анимация" больше не записывается. Он написан, но так же, как в формате выше.


Напиши точно в строках, большинство разработчиков избегают таких, потому что это немного затруднительно писать со всеми скобками и скобками.

UIView.animateWithDuration(10.0, animations: {
  self.navigationController.toolbar.frame = CGRect(x:0.0, y:10.0, width:10.0, height:0.0)
})

(В отличие от закрывающего закрытия вы написали имя, то есть "анимации" ) Это известно как встроенное закрытие


Напишите в более модульном смысле

UIView.animateWithDuration(duration: NSTimeInterval, animations: animatingFunc)

func animatingFunc() {
self.navigationController.toolbar.frame = CGRect(x:0.0, y:10.0, width:10.0, height:0.0)
}

Помните, что тип параметра "анимация" был () -> Void

Точно так же, как мы делаем, animatingFunc не принимает никаких параметров, т.е. '()' и ничего не возвращает, т.е. 'void'

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


Боковое примечание 1 Вы также можете ничего не делать (что действительно не имеет смысла, но во многих других обработчиках/анимациях/обработчиках завершения вы можете ничего не делать)

UIView.animateWithDuration(duration: NSTimeInterval, animations: nil)

Боковое примечание 2

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