2016-05-13 6 views
3

私のソフトウェアで使用する通貨演算子は、Doubleを使用し、より正確な計算のために通貨タイプを返します。シンボルは演算子ではなく識別子と見なされます

カスタムオペレータのコードは、基本的にはこれに似ています。明示的な精度の落ち込みを無視し、この形式では役に立たない演算子を無視してください。

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を生成します。私はなぜこのことが許されないのかはわかりません。

+1

スウィフト本をダウンロードして、識別子と演算子の正確な構文を確認してください。 "€"が識別子であり、 "£"が演算子である場合は、Swift言語の構文がそう言います。 PS。 "巧妙な"コードを使用しようとすると非常に注意してください。 – gnasher729

答えて

7

文字を知ることができ、かつ€は、これらのものではありません。 (対応するLexer codeも見つけることができます)。

2つの通貨記号との間の主な違いは、£(また¢¥)はラテン1補助ブロックであることである - 、(U + 0080 U + 00FF)一方通貨記号ブロック(U + 20A0 - U + 20CF)にあり、何らかの理由でSwift言語は、これらをオペレータのような識別子のようなものとみなします。

  • オペレータの最初の文字は、これらのいずれかである必要があります

    • .
    • /=-+!*%<>&|^~?
    • ラテン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 + 1DFF U + 1DC0)ブロック全体ダイアクリティカルマーク補足を組み合わせる
    • シンボル(U + 20D0 - U + 20FF)のためのダイアクリティカルマークを組み合わせる
    • :ブロック全体
    • バリエーションセレクタ(U + FE00 - U + FE0F): - U + FE2Fハーフマーク(U + FE20を組み合わせるブロック全体
    • ):ブロック全体
    • バリエーションセレクタサプリメント(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 

のユニコードU+2070 – U+20CF間に入るU+20ACでは、有効な識別子です。 £というユニコードは、有効な識別子ではないU+00A3です。 (U+00A8, U+00AA, U+00AD, U+00AFは、すべての有効な識別子であることに注意してください!)

あなたはThe Swift Programming Languageにリストされているカスタムオペレータに許可され、有効な識別子と演算子here

関連する問題