Аргумент функции 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, поэтому его необходимо экранировать в использоваться в качестве идентификатора.