乘法符号的定义是这个。
public func *(lhs: Int, rhs: Int) -> Int
我可以在一个函数中使用它,就像这样。
func productUsingReduce(xs: [Int]) -> Int {
return xs.reduce(1, { x,y in x * y})
}
或者就是这样。
func productUsingReduce(xs: [Int]) -> Int {
return xs.reduce(1, *)
}
如果我尝试使用不同的名称定义相同的内容。
func yes(lhs: Int, rhs: Int) -> Int {
return lhs * rhs
}
当我尝试使用它时,我遇到编译器错误。
func productUsingReduce(xs: [Int]) -> Int {
return xs.reduce(1, { x,y in x yes y})
}
为什么?
为什么下面的sytnax没有编译?
func productUsingReduce(xs: [Int]) -> Int {
return xs.reduce(1, { x, y in *(lhs: x, rhs: y) })
}
答案 0 :(得分:1)
您的函数func yes(..
只是一个标准函数。
要定义运算符,您必须声明运算符
infix operator yes
和相应的功能
func yes(lhs: Int, rhs: Int) -> Int {
return lhs * rhs
}
但现在出现了坏消息:你不能使用字母数字字符作为运算符。
答案 1 :(得分:0)
*
定义由两部分组成:
方法定义(Swift.Math.Integers
,Swift.Math.Floating
等)
public func *(lhs: Int, rhs: Int) -> Int
及其操作符行为(在Swift
中,您可以在Xcode中编写import Swift
并在CMD上单击它以访问该文件)
infix operator * : MultiplicationPrecedence
最后一个片段使*
成为中缀运算符,因此您只能以中缀形式使用它。
关于yes
功能,您无法使其成为运营商。当可以定义您自己的自定义运算符时,它们只能包含某些字符。根据{{3}}:
自定义运算符可以以ASCII字符之一/,=, - ,+,!,*,%,<,>,&,|,^,?或〜或其中一个Unicode开头下面的语法中定义的字符(包括数学运算符,杂项符号和标志Unicode块中的字符等)。在第一个字符之后,也允许组合Unicode字符。
所以你必须使用它的标准函数形式。
但你可以做到
func ^^^(lhs: Int, rhs: Int) -> Int {
return lhs * rhs
}
infix operator ^^^
这将按预期工作
3 ^^^ 2 // 6