数学符号作为函数参数

Nik*_*nko 7 swift

我可以以某种方式发送数学符号(+, - ,*)作为函数参数?我想reduce()为不同的标志调用功能.

Zel*_* B. 11

在swift中,是指定数学运算的函数名称.要将sign作为参数传递,参数类型必须是带两个数字并返回数字的函数.如果您命令+单击任何符号,您将看到其定义如下:

public func +(lhs:UInt8,rhs:UInt8) - > UInt8

public func +(lhs:Int8,rhs:Int8) - > Int8

public func +(lhs:UInt16,rhs:UInt16) - > UInt16

public func +(lhs:Int16,rhs:Int16) - > Int16

public func +(lhs:UInt32,rhs:UInt32) - > UInt32

public func +(lhs:Int32,rhs:Int32) - > Int32

public func +(lhs:UInt64,rhs:UInt64) - > UInt64

public func +(lhs:Int64,rhs:Int64) - > Int64

public func +(lhs:UInt,rhs:UInt) - > UInt

public func +(lhs:Int,rhs:Int) - > Int

在您的情况下,您的reduce函数应如下所示

func reduce(sign: (Int,Int)->Int) -> Int{

    return sign(2,3)
}

reduce(*)
reduce(-)
Run Code Online (Sandbox Code Playgroud)


luk*_*302 7

func doSomeCalculation(_ fun:((Int, Int) -> Int)) -> Int {
    return fun(12,13)
}

doSomeCalculation(+) // 25
doSomeCalculation(-) // -1
Run Code Online (Sandbox Code Playgroud)

同样可以做到的UInt,对IntXX

+基本上只是一个函数,它接受两个参数并返回它的总和.由于functions是任何其他对象,你可以将它们传递给它们.

你可以用同样的方式+进入reduce.


Cri*_*tik 5

是的,您可以向reduce()函数发送任何二元运算符,前提是原始值和集合中的元素类型相同,因此可以应用运算符。

将运算符视为函数/闭包,您就会明白为什么这在 Swift 中是可能的。事实上,操作符就像函数一样——它们被命名为闭包。

还要考虑可以添加新运算符的方式 - 您定义一个带有运算符名称的函数,该函数采用的参数数量等于运算符的数量。

因此,以下在语法上是正确的,并提供了预期的输出 ( 6):

[1,2,3].reduce(0, combine: +)
Run Code Online (Sandbox Code Playgroud)