我想在我的软件中实现一个货币运算符,它采用Double并返回Currency类型以进行更精确的计算。
自定义运算符的代码基本上看起来像这样。请忽略这种形式下明显的精度下降,因此无用的操作员。
postfix operator £ { }
postfix func £(number: Double) -> Int {
return Int(number)
}
3.50£ // returns Int(3)
这在Swift中运行良好。有趣的是,尽管我在使用€符号完全相同时遇到了错误。
postfix operator € { }
postfix func €(number: Double) -> Int {
return Int(number)
}
这会产生错误'€' is considered to be an identifier, not an operator
。我不理解为什么不允许这样做。
答案 0 :(得分:8)
自定义运算符中允许的字符列在The Swift Programming Language中,而€不是其中之一。 (您也可以找到相应的Lexer code)。
两个货币符号之间的主要区别在于£(以及¢和¥)位于Latin-1补充区块中(U + 0080 - U + 00FF),而€位于货币符号块(U + 20A0 - U + 20CF)中,由于某种原因,Swift语言将这些视为标识符而不是操作员等。
运算符的第一个字符必须是以下之一:
.
/=-+!*%<>&|^~?
¡¢£¤¥¦§©«¬®°±¶»¿×÷
‖‗†‡•‣․‥…‧‰‱′″‴‵‶‷‸‹›※‼‽‾⁁⁂⁃⁄⁅⁆⁇⁈⁉⁊⁋⁌⁍⁎⁏⁐⁑⁒⁓⁕⁖⁗⁘⁙⁚⁛⁜⁝⁞
、。〃〈〉《》「」『』【】〒〓〔〕〖〗〘〙〚〛〜〝〞〟〠〡〢〣〤〥〦〧〨〩〪〭〮〯〫〬〰
操作符的其余部分也可以是以下字符之一:
仅当第一个字符为.
时,.
才会出现在运算符的其余部分。
答案 1 :(得分:2)
有趣的问题!
在Swift中,我们不能使用标识符来重载运算符。 (它是运算符重载而不是标识符重载;))
postfix operator a {} //A is an identifier. Compiler throws the Same error
由于某种原因,€
是标识符,而£
是有效的运算符!
var € = 35 //Compiles
var £ = 35 //Doesn't compile because
€
的unicode U+20AC
介于U+2070 – U+20CF
之间,是有效的标识符。 £
的unicode是U+00A3
,它不是有效的标识符。 (请注意,U+00A8, U+00AA, U+00AD, U+00AF
都是有效的标识符!)
您可以找到有效的标识符和运算符here