Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
swift函数动态应用参数_Swift - Fatal编程技术网

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