gpt4 book ai didi

为函数提供 2 个闭包的 Swifty 方法

转载 作者:行者123 更新时间:2023-11-28 11:39:38 26 4
gpt4 key购买 nike

我有一个语法如下的函数:

func myfunc<V1,V2>(to: (V1)->V2, from: (V2)->V1)

如您所见,我为此函数提供了 2 个闭包。 这 2 个闭包用于将 V1 转换为 V2,反之亦然。请记住,我无法将这些转换作为 extension 提供给 V1V2 我想提高函数的可用性,我想知道作为 Swift 用户提供这 2 个更常见和更好的方法是什么。

我有 3 种方法,每种方法各有利弊。

第一种方法:使用当前语法。

func myfunc<V1,V2>(to: (V1)->V2, from: (V2)->V1)

优点:用户提供了 2 个闭包,因此他可以更好地组织代码。此外,他还可以就地提供它们。

缺点:函数调用会变长,只能使用trailing closure进行二次闭包。

第二种方法:对两者使用一个闭包并通过参数区分它们。

enum ConvertClosure {
case .to(Any)
case .from(Any)
}

func myfunc<V1,V2>(operation: (ConvertClosure)->Any)

优点:函数调用变得更简单,我们也可以使用尾随闭包

缺点:2 个闭包的责任现在在一个闭包中,因此变得更加复杂。无法添加泛型类型检查,需要使用 Any 作为枚举大小写参数和函数返回类型。

第三种方法:使用协议(protocol)而不是闭包。

protocol ConvertOperation {
associatedtype InVal
associatedtype OutVal
func to(_ val: InVal) -> OutVal
func from(_ val: OutVal) -> InVal
}

func myfunc<V1,V2>(operation: ConvertOperation)
where ConvertOperation.InVal == V1, ConvertOperation.OutVal == V2

优点:函数调用变得更简单。我们有来自泛型的类型检查。

缺点:我们需要遵守无法就地完成的协议(protocol)。方法没有使用闭包,所以它可能不是很 Swifty。

哪种方法更适合 Swift 用户?你能推荐更好的方法吗?

最佳答案

这可能有点基于意见,但一般规则是:

  1. 尽可能使用最具体的类型。您希望类型在编译期间为您捕获错误。

  2. 当您想要重用功能时使用协议(protocol)。协议(protocol)将要求您使用将实现它的结构/类,因此使其更难使用。因此,当您已经拥有一个可以符合该协议(protocol)的对象或者当功能被重用时会更好,因此您可以创建一个对象并多次使用它。

要对您的案例发表更多评论:

  1. 如果有多个闭包参数,则不应使用尾随闭包,因为这会影响可读性。但是,这不是一个糟糕的解决方案,而且很常见。

  2. 这通常是一个糟糕的解决方案,因为它使用了违反上述规则 1 的 Any 类型。始终尽量减少 Any 的使用。大多数应用程序根本不应该使用它。

  3. 这不是一个糟糕的解决方案,但请参阅规则 2。我将仅在特定用例中是最优的。

还要考虑 NSObjectAny 基本相同。一般来说,你应该避免在 Swift 代码中使用它,因为你基本上放弃了类型检查。另请注意,您不应以尽可能短的代码为目标。始终以可读性为目标。

如果不知道确切的用例,我们可能无法提供更具体的建议。

关于为函数提供 2 个闭包的 Swifty 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54054813/

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