如何定义返回绑定的函数/闭包?

Posted

技术标签:

【中文标题】如何定义返回绑定的函数/闭包?【英文标题】:How can I define a function/closure which returns a Binding? 【发布时间】:2021-11-19 01:12:54 【问题描述】:

当我在某些情况下必须初始化 Binding 时,我想制作一个让我的打字更容易的函数!

代码如下:

func bindingFunction(value: inout CGFloat) -> Binding<CGFloat> 
    return Binding(get:  return value , set:  newValue in value = newValue )

我从 xCode 收到 2 个错误:

    参数“value”被声明为“inout”

转义闭包捕获'inout'参数'value'

我的目标是首先解决这些错误,最后我想让我的函数也通用,因为你看到我的函数适用于我的绑定 CGFloat想让它通用,然后我可以在需要 Binding Bool 时使用它。

【问题讨论】:

inout 在这里不起作用的相关信息:***.com/a/39572470/560942 那么我的目标是不可能的,对吧? 如果您的要求之一是使用inout,这似乎不太可能(尽管也许有人知道一些疯狂的技巧来让它工作)。您可能可以通过将转义闭包作为返回值的参数而不是 inout 参数来使其工作,但在这一点上,真的没有理由不首先编写 Binding。 正如我所说的打字问题会更好。 但是如果你使用了闭包,你需要提供两个闭包——一个用来获取值,一个用来设置值,这正是 Binding 首先要做的。所以,它不会为你节省任何东西。 【参考方案1】:

正如您在 cmets 中看到的那样,没有一个好的通用解决方案。如果您有 ReferenceWritableKeyPath 可以使用(这意味着没有值类型,例如您的 CGFloat),您真的可以让它变得更容易。

一般来说,没有人需要这个,因为我们都在使用ObservableObjects + @Published

final class Model 
  var leaves = "?"


let model = Model()
let fallenLeaves = "?"
@Binding(model, keyPath: \.leaves) var leaves;
leaves = fallenLeaves
XCTAssertEqual(model.leaves, fallenLeaves)
public extension Binding 
  init(
    accessors: (
      get: () -> Value,
      set: (Value) -> Void
    )
  ) 
    self.init(get: accessors.get, set: accessors.set)
  

  init<Root>(
    _ root: Root,
    keyPath: ReferenceWritableKeyPath<Root, Value>
  ) 
    self.init(accessors: keyPath.accessors(root))
  

public extension ReferenceWritableKeyPath 
  /// Partially-applied `get` and `set` accessors for this key path.
  ///
  /// Typical usage: `accessors(root)`
  var accessors: (Root) -> (
    get: () -> Value,
    set: (Value) -> Void
  ) 
     root in
      ( get:  root[keyPath: self] ,
        set:  root[keyPath: self] = $0 
      )
    
  

【讨论】:

感谢您的宝贵时间,当我尝试使用您给定的代码时,看起来我应该为它提供 2 个闭包以开始工作,但是我无法使用它。所以我可以对获取和设置的原始绑定初始化做同样的事情!你的代码在哪里有用?在我的问题中也是在我的代码中,我尝试至少使打字部分比原始绑定更短更容易。 好的,我会再试一次,谢谢。 我再次查看了 XCTest 示例,我认为它需要类或自定义类才能工作,因为我的代码或函数不需要类,我无法利用您的回答,但感谢您的帮助。 没错。我添加了一个括号。

以上是关于如何定义返回绑定的函数/闭包?的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript 闭包

实现闭包(摘录自 权威指南184页)

深入解析Javascript闭包及实现方法

Cocos creator之javascript闭包

javascript基础知识(27) 闭包2

闭包函数延迟绑定问题