这个 Swift 代码在做什么?func somefunc(其中: (_: NSLayoutConstraint) -> Bool)

What is this Swift code doing? func somefunc(where: (_: NSLayoutConstraint) -> Bool)

提问人:testdrive 提问时间:2/20/2020 更新时间:2/20/2020 访问量:72

问:

我习惯了 Objective-C,但不习惯 Swift。我了解 Swift 的基础知识,我试图阅读文档并自己掌握它,但做不到。让我感到困惑的是函数声明,我不明白发生了什么,它接受哪些参数(或其他函数?)以及它对内部做了什么。如果有人能用 Objective-C 来翻译它,那就太好了,它会向我解释它。where

// 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

iOS Objective-C Swift iPhone Cocoa-Touch

评论


答:

2赞 Pierre 2/20/2020 #1

函数参数就是所谓的闭包,即。一个函数。removeFirstConstraint

有关闭合的更多信息,请访问:https://docs.swift.org/swift-book/LanguageGuide/Closures.html

在您的情况下,闭合必须具有签名,即。它应该接受一个 As 参数并返回一个布尔值。 因此,对于您的情况,该函数将在 UIView 的每个约束上调用闭包,并删除第一个在作为参数传递给闭包时将返回 true 的闭包。(_: NSLayoutConstraint) -> BoollayoutConstraintremoveFirstConstraint


函数的两次调用是等效的,你可以传递一个闭包作为函数的正常参数,

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

或者这样简化:

trackView.removeFirstConstraint { /*closure code*/ }

$0 表示闭包的第一个参数。 因此,代码

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

将删除第一个等于 的约束。firstAttributewidthAttribute


哦,在代码中

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

作为参数传递给函数的闭包直接传递给函数,函数也采用闭包作为参数。,在数组上调用,返回使闭包返回 true 的第一项的索引。whereremoveFirstConstraintfirstIndexfirstIndex

引号周围是必要的,因为 where 是 swift 关键字,因此必须对其进行转义才能用作标识符。where