swift函数动态应用参数
我正在尝试实现可以应用参数的函数。我读了很多参考资料,它是可能的,无论我多么想为所有情况下,不知道它是否可行 比如说,swift函数动态应用参数,swift,Swift,我正在尝试实现可以应用参数的函数。我读了很多参考资料,它是可能的,无论我多么想为所有情况下,不知道它是否可行 比如说, infix operator <<< ; func <<<< T >( lhs : ( T ) -> T , rhs : [ T ] ) -> T { return lhs( rhs[ 0 ] ) ; } ; func Foo ( _ a : Int )-> Int { return a ; }
infix operator <<< ;
func <<<< T >( lhs : ( T ) -> T , rhs : [ T ] ) -> T {
return lhs( rhs[ 0 ] ) ;
} ;
func Foo ( _ a : Int )-> Int { return a ; }
Foo<<<[ Int ]
或许
func Foo ( _ a : Int , _ b : Any , _ c : String )-> Any { return Any ; } ;
然后
有什么建议吗?非常感谢。我不确定这是否是您想要的:
infix operator <<<
func <<< <U,V> (lhs: (U...) -> V, rhs: [U]) -> V {
return lhs(rhs[0])
}
例如:
func Foo (_ a: Int...) -> Double {
return a.map { 1.5 * Double($0) }
.reduce(0, +)
}
Foo <<< [3, 5] //4.5
Foo <<< [1] //1.5
@如果Foo接受2个或更多的参数呢?这是我的问题,非常感谢,我的意思是,如果你不知道函数将采用什么样的参数,你能用具体的用例编辑你的问题吗?我想你真的应该接受我在我的演讲中所说的。Swift不是JS,也不是PHP。JS和PHP都没有函数重载。Swift具有函数重载。具有一个名称的函数可以有多个重载,这些重载在参数类型、参数计数或返回类型上有所不同。将数组应用于函数不起作用,因为不清楚应该调用哪个重载。在这种情况下,我建议您明确表示,您只是在玩转和探索哪个完全好,而且非常有趣!。有效的堆栈溢出答案的很大一部分是回答帧。解决问题的最佳方法是减轻问题存在的必要性。假设您有两个函数,都名为foo,重载为foo_i:Int、\b:Bool和foo_c:Character、\s:String。1参数数组必须具有类型[Any]T,在您的示例中,它将被推断为Any,因为这些类型是异构的2您需要一个运行时机制来执行与编译器编译时重载解析相同的任务。。。运行时机制需要检查param数组中元素的计数和类型,并根据Swift的函数重载解析规则确定foo_i:Int、b:Bool是最佳匹配,还是foo_c:Character、s:String。考虑退货类型时,有3件事情变得非常复杂。假设一个foo重载返回一个Void,另一个重载返回数据。这个操作符的返回类型应该是什么?调用的foo重载在运行时之前是未知的,因此返回类型在运行时之前是未知的。如果您要实现运行时机制来执行重载解析,让您的运算符返回唯一可能的类型,因为任何一组重载函数都可能返回任何不同的类型,那么您基本上会得到一种动态语言,如JS或PHP,放弃了Swift的所有好处,参数/返回值的类型检查,值计数的检查,函数重载的说服,等等。
infix operator <<<
func <<< <U,V> (lhs: (U...) -> V, rhs: [U]) -> V {
return lhs(rhs[0])
}
func Foo (_ a: Int...) -> Double {
return a.map { 1.5 * Double($0) }
.reduce(0, +)
}
Foo <<< [3, 5] //4.5
Foo <<< [1] //1.5