使用"where"子句在Swift算术中生成可选类型

Qui*_*ana 5 where uiscrollview ios swift

我想在用户交互期间触发基于某些UI关系的条件逻辑(在这种情况下,我想在用户滚动到a中的某个点时调用方法UIScrollView).我希望以下代码行能够合法地执行此操作,因为它具有很强的表现力:

func scrollViewDidScroll(scrollView: UIScrollView) {
    guard let overlap = scrollView.contentOffset.y - 220 where overlap > 0 else {
        return
    }

    reactToScrollOverlap(of: overlap)
}
Run Code Online (Sandbox Code Playgroud)

但是,我得到的错误是guard let需要一个可选类型.这是合理的,但我希望在这种情况下该where子句自然会引入一个可选项,因为如果算法运算错误则没有匹配值overlap.

有没有办法使用guard let(或者说if let),包含的where条款规定了Int,CGFloat或其他原始/原始类型之间算术结果的条件?

Sul*_*han 2

您在一个表达式中做了三件事 - 声明一个变量(常量)、为其赋值并检查其值。

在表达式中声明变量通常会令人不悦,Swift 并没有真正启用它。但有一个例外 - 选项的展开。您没有展开可选内容,因此只需将表达式正确拆分为声明和比较:

let overlap = contentOffset.y - 220

guard overlap > 0 else {
    return
}
Run Code Online (Sandbox Code Playgroud)

另一种选择是使用该case let模式。我不是它的忠实粉丝,但这可能就是你想要的:

guard case let overlap = contentOffset.y - 220 where overlap > 0 else {
    return
}

print("overlap:", overlap)
Run Code Online (Sandbox Code Playgroud)