2016-05-13 74 views
3

我想實現一個貨幣操作符用於我的軟件中,該軟件採用Double並返回Currency類型以進行更精確的計算。符號被認爲是一個標識符,而不是運營商

自定義運算符的代碼基本上看起來有點像這樣。請忽略這種形式的明顯的精度下降,因此無用的操作符。

postfix operator £ { } 
postfix func £(number: Double) -> Int { 
    return Int(number) 
} 

3.50£ // returns Int(3) 

這斯威夫特工作正常。有趣的是,儘管我在嘗試與€符號完全相同時遇到了錯誤。

postfix operator € { } 
postfix func €(number: Double) -> Int { 
    return Int(number) 
} 

這將產生錯誤'€' is considered to be an identifier, not an operator。我不明白爲什麼這是不允許的,但。

+1

下載Swift書並檢查標識符和運算符的確切語法。如果「€」是一個標識符,「£」是一個操作符,那是因爲Swift語言的語法如此。 PS。嘗試使用「聰明」的代碼時要非常小心。 – gnasher729

回答

7

中的人物,而€是不是其中之一。 (您也可以找到相應的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):全部除外圈出的數字(U + 27C0 - U + 27EF):整個塊
    • 補充箭頭-A(U + 27F0 - U + 27FF):整個塊
    • 盲文模式(U + 2800 - U + 28FF):整體塊
    • 補充箭頭B(U + 2900 - U + 297F):整體塊
    • 其他數學符號B(U + 2980 - U補充數學運算符(U + 2A00 - U + 2AFF):整塊
    • 其他符號和箭頭(U + 2AFF):整個塊
    • 2B00 - U + 2BFF):整體塊
    • 補充標點符號(U + 2E00 - U + 2E7F):整體塊
    • CJK符號和標點:、。〃〈〉《》「」『』【】〒〓〔〕〖〗〘〙〚〛〜〝〞〟〠〡〢〣〤〥〦〧〨〩〪〭〮〯〫〬〰
  • 操作的其餘部分也可以是這些字符中的一個:

    • 結合變音符號(U + 0300 - U + 036F):整體塊
    • 結合區別標記補充(U +曼尼普爾語 - U + 1DFF):整體塊
    • 結合區別標記爲符號(U + 20D0 - U + 20FF):整體塊
    • 變化選擇器(U + FE00 - U + FE0F):整體塊
    • 結合半月痕(U + FE20 - U + FE2F ):整體塊
    • 變化選擇器補編(U + E0100 - U + E01FF):整體塊
  • .一個可以在操作者的剩餘部分僅在第一個字符是.出現。

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介於是有效的標識符。 £的統一碼是U+00A3,這不是一個有效的標識符。 (注意:U+00A8, U+00AA, U+00AD, U+00AF都是有效的標識!)

您可以瞭解在運營商定製允許The Swift Programming Language列出有效標識符和運營商here

相關問題