Что делает этот код Swift? fun c somefun c (где: (_: NSLayoutConstraint) -> Bool) - PullRequest
2 голосов
/ 20 февраля 2020

Я привык к Objective- C, но не к Swift. Я понимаю основы Swift, и я пытался читать документы и сам, но не могу. Что меня смущает, так это объявление функции, я не понимаю, что происходит, какие аргументы (или другую функцию?) Она принимает и что делает с where внутри. Если бы кто-то мог перевести это с точки зрения Objective- C, это было бы замечательно, и это объяснило бы мне.

// extension of UIView
    func removeFirstConstraint(where: (_: NSLayoutConstraint) -> Bool) {
         if let constrainIndex = constraints.firstIndex(where: `where`) {
              removeConstraint(constraints[constrainIndex])
         }
    }

И так это называется в других частях кода (подкласс UIView):

trackView.removeFirstConstraint { $0.firstAttribute == widthAttribute }

и

removeFirstConstraint(where: { $0.firstAttribute == oldConstraintAttribute && $0.firstItem === self && $0.secondItem == nil })

, что также смущает меня из-за разницы и использования where.

1 Ответ

2 голосов
/ 20 февраля 2020

Аргумент функции removeFirstConstraint - это то, что называется замыканием, ie. функция.

Подробнее о замыканиях здесь: https://docs.swift.org/swift-book/LanguageGuide/Closures.html.

В вашем случае замыкание должно иметь подпись (_: NSLayoutConstraint) -> Bool, ie. он должен принять layoutConstraint в качестве аргумента и вернуть логическое значение. Таким образом, для вашего случая функция removeFirstConstraint будет вызывать замыкание для каждого ограничения UIView и удаляет первое, которое при передаче в качестве аргумента закрытию возвращает true.


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

trackView.removeFirstConstraint (where: { /*closure code*/ }) 

или упростить таким образом:

trackView.removeFirstConstraint { /*closure code*/ }

$ 0 представляет первый аргумент закрытие Следовательно, код

trackView.removeFirstConstraint { $0.firstAttribute == widthAttribute }

удалит первое ограничение, firstAttribute которого равно widthAttribute.


Oh, и в коде

func removeFirstConstraint(where: (_: NSLayoutConstraint) -> Bool) {
         if let constrainIndex = constraints.firstIndex(where: `where`) {
              removeConstraint(constraints[constrainIndex])
         }
    }

замыкание where, переданное в качестве аргумента функции removeFirstConstraint, напрямую передается функции firstIndex, которая также принимает замыкание в качестве параметра. firstIndex, вызываемый для массива, возвращает индекс первого элемента, который делает возвращаемое закрытие верным.

Кавычки вокруг where необходимы, потому что где ключевое слово swift, поэтому его необходимо экранировать в использоваться в качестве идентификатора.

...