Синтаксис блока в 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))

person Ryan Heitner    schedule 04.06.2014    source источник


Ответы (5)


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

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

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

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

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

UIView.animateWithDuration(10.0) {
  self.navigationController.toolbar.frame = CGRect(x:0.0, y:10.0, width:10.0, height:0.0)
}
person Jiaaro    schedule 04.06.2014
comment
может быть, скользящее закрытие было бы еще проще? :) - person Sulthan; 04.06.2014
comment
@Jiaaro Именованные аргументы не проблема. Это должен быть последний аргумент, вот и все. - person Sulthan; 04.06.2014
comment
Это только я или закрытие замыканий гораздо более запутанно? Кто-нибудь знает, какой язык повлиял на это или почему это имеет смысл? - person sanz; 04.06.2014
comment
@tony Groovy имеет синтаксис завершающего замыкания. Есть больше сходства - person emp; 11.06.2014

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

{(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.
})

Вот документация для закрытия.

person 67cherries    schedule 04.06.2014

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

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

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

className.testFunc {
(list: NSArray!) -> Void in
}
person Prakash Raj    schedule 30.09.2014

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

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

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

person Honey    schedule 01.12.2016

Как объявить закрытие в Swift?

  1. В качестве переменной:

    var closureName: (ParameterTypes) -> ReturnType

  2. Как необязательная переменная:

    var closureName: ((ParameterTypes) -> ReturnType)?

  3. Как псевдоним типа:

    typealias ClosureType = (ParameterTypes) -> ReturnType

  4. Как константа:

    let closureName: ClosureType = { ... }

  5. В качестве параметра другой функции:

    funcName(parameter: (ParameterTypes) -> ReturnType)

Примечание: если переданное закрытие выйдет за рамки метода, например. если вы сохраняете его в свойство, оно должно быть аннотировано @escaping.

  1. В качестве аргумента вызова функции:

    funcName({ (ParameterTypes) -> ReturnType in statements })

  2. В качестве параметра функции:

    array.sorted(by: { (item1: Int, item2: Int) -> Bool in return item1 < item2 })

  3. В качестве параметра функции с подразумеваемыми типами:

    array.sorted(by: { (item1, item2) -> Bool in return item1 < item2 })

  4. В качестве параметра функции с подразумеваемым возвращаемым типом:

    array.sorted(by: { (item1, item2) in return item1 < item2 })

  5. В качестве последнего параметра функции:

    array.sorted { (item1, item2) in return item1 < item2 }

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

    array.sorted { return $0 < $1 }

  7. В качестве последнего параметра с подразумеваемым возвращаемым значением:

    array.sorted { $0 < $1 }

  8. В качестве последнего параметра, как ссылка на существующую функцию:

    array.sorted(by: <)

  9. В качестве параметра функции с явной семантикой захвата:

    array.sorted(by: { [unowned self] (item1: Int, item2: Int) -> Bool in return item1 < item2 })

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

    array.sorted(by: { [unowned self] in return $0 < $1 })

Этот сайт не претендует на исчерпывающий список всех возможных применений замыканий.
ref: http://goshdarnclosuresyntax.com/

person Zgpeace    schedule 07.01.2020