符号被视为标识符,而不是运算符

时间:2016-05-13 07:51:07

标签: swift

我想在我的软件中实现一个货币运算符,它采用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。我不理解为什么不允许这样做。

2 个答案:

答案 0 :(得分:8)

自定义运算符中允许的字符列在The Swift Programming Language中,而€不是其中之一。 (您也可以找到相应的Lexer code)。

两个货币符号之间的主要区别在于£(以及¢¥)位于Latin-1补充区块中(U + 0080 - U + 00FF),而位于货币符号块(U + 20A0 - U + 20CF)中,由于某种原因,Swift语言将这些视为标识符而不是操作员等。

  • 运算符的第一个字符必须是以下之一:

    • .
    • /=-+!*%<>&|^~?
    • Latin-1补充:¡¢£¤¥¦§©«¬®°±¶»¿×÷
    • 一般标点符号:‖‗†‡•‣․‥…‧‰‱′″‴‵‶‷‸‹›※‼‽‾⁁⁂⁃⁄⁅⁆⁇⁈⁉⁊⁋⁌⁍⁎⁏⁐⁑⁒⁓⁕⁖⁗⁘⁙⁚⁛⁜⁝⁞
    • 箭头(U + 2190-U + 21FF):整块
    • 数学运算符(U + 2200 - U + 22FF):整块
    • 其他技术(U + 2300 - U + 23FF):整块
    • 箱子图(U + 2500 - U + 257F):整块
    • 块元素(U + 2580 - U + 259F):整块
    • 几何形状(U + 25A0 - U + 25FF):整块
    • 杂项符号(U + 2600 - U + 26FF):整块
    • 标志(U + 2700 - U + 27BF):所有带圆圈的数字❶-❿,➀-➉,➊-➓
    • 杂项数学符号-A(U + 27C0 - U + 27EF):整块
    • 补充箭头-A(U + 27F0-U + 27FF):整块
    • 盲文模式(U + 2800 - U + 28FF):整块
    • 补充箭头-B(U + 2900-U + 297F):整块
    • 杂项数学符号-B(U + 2980 - U + 29FF):整块
    • 补充数学运算符(U + 2A00 - U + 2AFF):整块
    • 其他符号和箭头(U + 2B00 - U + 2BFF):整块
    • 补充标点符号(U + 2E00 - U + 2E7F):整块
    • CJK符号和标点符号:、。〃〈〉《》「」『』【】〒〓〔〕〖〗〘〙〚〛〜〝〞〟〠〡〢〣〤〥〦〧〨〩〪〭〮〯〫〬〰
  • 操作符的其余部分也可以是以下字符之一:

    • 结合变音符号(U + 0300 - U + 036F):整块
    • 结合变音符号补充(U + 1DC0 - U + 1DFF):整块
    • 组合符号的变音符号(U + 20D0 - U + 20FF):整块
    • 变体选择器(U + FE00 - U + FE0F):整块
    • 组合半标记(U + FE20 - U + FE2F):整块
    • 变体选择器补充(U + E0100 - U + E01FF):整块
  • 仅当第一个字符为.时,.才会出现在运算符的其余部分。

答案 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