【发布时间】:2020-02-16 19:40:22
【问题描述】:
最近我遇到了创建函数数组的需求。不幸的是,Swift 语言没有为函数提供顶级类型,而是必须通过它们的特定签名 (...)->(...) 来声明它们。所以我尝试编写一个可以容纳任何函数的包装器,然后将其专门用于仅容纳具有Void 返回类型和任意数量的参数的闭包。
struct AnyFunction {
let function: Any
init?(_ object: Any){
switch String(describing: object){
case let function where function == "(Function)":
self.function = object
default:
return nil
}
}
func callAsFunction(){
self.function()
}
}
随着我的进步,我发现这并非微不足道,可能需要一些内省的技巧,但尽管我尝试了,但我未能找到解决方案。编译器消息:
error: cannot call value of non-function type 'Any'
那么你将如何制作这个技巧,即明确地说,定义一个可以容纳任何函数类型的对象?
澄清: 我更喜欢定义如下内容:
typealias SelfSufficientClosure = (...)->Void
var a, b, c = 0
let funcs = FunctionSequence
.init(with: {print("Hi!")}, {a in a + 3}, {b in b + 3}, { a,b in c = a + b})
for f in funcs { f() }
print([a, b, c])
//outputs
//"Hi"
//3, 3, 6
PS 这个问题和这个问题有关 (Any or a trouble with sequence of functions)
【问题讨论】:
-
什么是“任何功能类型”?您需要调用该函数,如果不同函数的签名不同,那么您的调用必须针对每个函数进行调整。我在你的代码中没有看到。那么你能澄清一下你想怎么称呼他们吗?
-
当然。我想要的基本上是一组闭包
[{print "Hi!"}, {someExternalSequence.apply{$0+1}}, {someObject.someValue = true}],以后可以在程序期间的某个时刻调用它们,并在需要时进行操作,这意味着添加或删除闭包。 -
没有描述“任何函数类型”的类型(正如在回答您之前的问题时指出的那样)。如果有:如果您不知道它需要的参数的数量和类型,您将如何调用这样的元素? (Objective-C 使用
NSInvocation类解决了这个问题。您可能可以在 Swift 中使用它,但只能将消息发送到NSObject子类的实例。) -
@MartinR 这个 AnyFunction 包装器用于证明不同的函数可以(或不能看起来)按顺序排列的概念。后来它将成为一个
(...)->Void特定类型,它拥有自给自足的闭包,这意味着那些已经捕获了一些上下文的闭包。var a, b, c = 0 let funcs = FunctionSequence(with: {print("Hi!")}, {a in a + 3}, {b in b + 3}, { a,b in c = a + b}) print([a, b, c], separator: " ") -
我当然可能错了,但我相当肯定 Swift 中没有“任何函数”类型。另见docs.swift.org/swift-book/LanguageGuide/Functions.html:“Swift 中的每个函数都有一个类型,由函数的参数类型和返回类型组成。”
标签: swift function callable any