gpt4 book ai didi

swift - 如何在 swift 中使用可变闭包?

转载 作者:搜寻专家 更新时间:2023-10-31 22:32:43 24 4
gpt4 key购买 nike

在 Swift 的闭包中是否有正确的方法来使用可变参数列表?

很快我注意到我可以像这样声明一个带有可变参数列表的函数

protocol NumberType: Comparable, IntegerLiteralConvertible, IntegerArithmeticType {}
extension Int: NumberType {}

extension SequenceType where Generator.Element: NumberType {
func satisfy(closure:(args: Generator.Element...) -> ()) {
// Do something
closure(args: 1, 2, 3)
}
}

构建得很好。当我尝试使用该功能时:

[1, 2].satisfy { (args) in
print (args)
}

Xcode 设法按照我的预期自动完成,但是在关闭 args 后的括号后,Xcode 中的所有语法突出显示都消失了,我看到一条消息 “命令因信号而失败:段错误:11”,这似乎只是意味着 Xcode 非常困惑。

对于上下文,我曾计划看看 Swift 是否可以编写一个函数,该函数可以根据可变数量的参数返回答案(映射到获得强力答案所需的 for 循环数)。这将是一种测试问题答案的简单方法,例如“给定一个整数数组,找到满足方程 a^3 + b^3 = c^3 + d^3 的所有组合”

let answer = array.satisfy ({ return pow($0, 3) + pow($1, 3) == pow($2, 3) + pow($3, 3) })

针对更优的解决方案。

“返回所有的 2”就是

let answer = array.satisfy ({ return $0 == 2 })

一个for循环

最佳答案

单表达式闭包的参数类型推断的编译器限制/错误

我相信这是编译器 w.r.t. 中的当前限制(/bug)的来源。使用可变参数推断单行闭包中的参数类型,参见例如以下问答

  1. Why can't I use .reduce() in a one-liner Swift closure with a variadic, anonymous argument?

Swift 2.1 中的 inout 参数也存在类似的问题(但不再出现在 2.2 中),如以下线程中所述

  1. Inline if statement mutating inout parameter in a void return closure, weird error (Error: type 'Int1' does not conform to protocol 'BooleanType')

查看线程 1,并尝试查找在 Swift JIRA 中标记的错误,然而,线程 1 的 OP 似乎从来没有为此提交过错误,毕竟。可能我只是没有找到现有的错误报告,但如果不存在,则应该提交一份。


当前的解决方法

在编译器的闭包参数类型推断 catch 之前,可能的解决方法是

  • 将闭包扩展到单行主体之外

    // ...

    [1, 2].satisfy { (args) in
    () // dummy
    print (args) // [1, 2, 3]
    }
  • 或者,明确包含args的类型,例如

    [1, 2].satisfy { (args: Int...) in
    print (args) // [1, 2, 3]
    }

    请注意,在上面的示例中,Generator.Element 解析为 Int


Swift 3.0-dev 的当前状态

正如上面简要提到的,奇怪的是,这个错误

  • inout: 显然不再出现在 Swift 2.2 或 Swift 3.0-dev 中用于 inout 参数,w.r.t. Q&A 2. as linked to above 中描述的问题

    • 它可能被固定为 bug [SR-7]已解决(-> Swift 2.2)
    • 但是,似乎是回归 2.2->3.0-dev,w.r.t. inout 参数的类型推断,如 bug report [SR-892] 中所报告.例如。以下代码片段适用于 Swift 2.2,但不适用于 3.0-dev(来自错误报告 [SR-7] 的最小修改片段)

      func f(inout a: Int) {}
      let g = { x in f(&x) } // OK 2.2, crashes 3.0-dev
  • 可变参数: 在 Swift 2.2 和 Swift 3.0-dev 中仍然存在可变参数(这个线程和 Q&A 1. above )。

    • 一个更简洁的错误示例:

      let a: (Int...) -> () = { (args) in print(args) }         // bug: crashes
      let b: (Int...) -> () = { (args: Int...) in print(args) } // explicitly state argument type, OK
      let c: (Int...) -> () = { (args) in (); print(args) } // extend to more than single line closure, OK

(对于 Swift 3.0-dev,使用 IBM Swift Sandbox running Swift 3.0-dev 进行了测试。

关于swift - 如何在 swift 中使用可变闭包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36489500/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com