Swift演算子操作


SwiftにはC++と同様の新しい特性が拡張されており、Swiftの演算子は良好な拡張性を提供しており、演算子を操作することができ、演算子の操作は実際には演算関数の書き換えやリロードである.注意演算子操作は一般的に操作されるパラメータにIn-Outモードを加えることが多い.
+、-(演算子の再ロード)
実際の開発では、Swiftはカスタム演算子であり、予め設定された演算子に限らず、+をリロードしてDoubleまたはFlaotにIntを加算することができます.Swiftは、IntとIntを加算できるようにする関数を提供しています.
       func + (left:Int,right:Int)->Int{
       return left+right

我々は完全に再構築することができます
func + (left:Int,right:Double)->Double
{
 return Double(left)+right

}
実装+演算子配列に要素を追加
      func +<T>(var left:[T],right:T)->[T]
  {
       left.append(right)
       return left
  } 

実験の結果、Swiftは対=の再構築をサポートしていないようです.
+、–(前、後の演算子)
前に述べた+および言っていない-は両目演算子であり、単目演算子、例えば+、-、Swiftは操作数を単目演算子の前に置くことを規定し、この演算子は前置演算子と呼ばれ、操作数は単目演算子の後ろに置かれ、この演算子は後置演算子と呼ばれている.
前演算子関数をリセットするにはprefixキーワード修飾を使用し、後演算子をリセットするにはpostfixキーワード修飾を使用する必要があります.
    prefix  func  ++ (operator:Type)->Type
{

 let result=++operator

}

                 `       `

postfix  func  -- (operator:Type)->Type
{

         let result=operator--
}

                 `       ` 

例:
      prefix func ++ <T> (inout array:[T])->[T] {
         array.append(array[array.count-1])
         return array
    }

    var strArr=["iOS","Android","WP"]
    print(++strArr)

+=(代入演算子)
C言語では+=代入演算子が提供されていますが、実際には2番目の値を1番目の値に加算します.ここで最初の値はIn-Outモードを使用する必要があります.
 func += <T>(inout left:[T],right:T)
{
left.append(right)
}

var myList=["iOS","Android"];
myList += "WP"
print(myList)

比較演算子
SwiftのInt、Double、Stringなどのタイプでは比較演算子がサポートされていますが、自分で定義したタイプでサイズを比較する必要がある場合は、カスタムタイプに次の2つの特徴を満たす必要があります.
  • Equatable、Comparableの2つのプロトコルを遵守します.
  • カスタムタイプに対して==および<2つの演算子を再ロードします.カスタムタイプに==と<の2つの演算子をリロードするだけで、Swiftは自動的に推定できます!=、<=、>、>=この4つの結果.フォーマットは、
      func  <(las:Type,hrs:Type)->Bool
      {
           let result=lhs<rhs
      }
    
     struct WXrect:Equatable,Comparable
     {
         var left:Double
         var top:Double
     var width:Double
         var height:double
        }
    fun ==(las:WXrect,hrs:WXrect)->Bool
    {
     return lhs.width*lhs.height==rhs.width*rhs.height
        }
    fun < (las:WXrect,hrs:WXrect)->Bool
    {
    return ls.width`*`ls.height`<`rhs.width*rhs.height
    }
        let rect1=WXrect(left:2.0,top:3.0,width:5.0,height:4.0)
        let rect2=WXrect(left:8.0,top:23.0,width:2.0,height:8.0)
                          letrect3=WXrect(left:7.0,top:3.0,width:10.0,height:10.0)
    
    print(rect1<rect2)
    print(rect1<=rect2)
    print(rect1!=rect2)
    print(rect1>rect2)
    
  • ステップ-独自の演算子を開発
    以上の蓄積を経て,演算子の操作を把握し,最後に独自の演算子開発を行った.
    カスタム演算子を2ステップで1つ作成
  • は、新しい演算子を宣言します.フォーマットは次のとおりです:
    prefix|infix|postfix operator     {} 
    
    prefix:       
    infix:       
    postfix:       
    
  • 新しい演算子に複数のリロードされた演算子関数
  • を提供する
    リロードされた演算子が前置演算子である場合、funcキーワードにprefixキーワードを追加する必要があります.リロードされた演算子が後置演算子である場合、funcキーワードにpostfixキーワードを追加する下で玉を投げる乗方演算子を開発する必要があります:**
    乗算は両目演算子である必要がありますので、まず新しい演算子を宣言します:**
    infix operator **{}
    

    新しい演算子にリロード関数を指定
         func ** (base:Int,exponent:Int)->Int
    {
       var result = 1
      for _ in 1...exponent
    {
     result *= base
    }
    return result
    }
    
    let a=5
    let b=3
    print("\(a) \(b)   :\(a ** b)")
    

    どうですか.Swiftは強いでしょう!カスタム演算子
    数学の問題を見てみましょう
                  20+10-5*5*5*2-30
    

    この問題はどうしますか.私は少しできません!O(∩∩)Oハハ~
    この数学の問題の側面は演算子が前後して実行する順序があることを反映して、それでは私達が第演算子をカスタマイズしても演算規則があるべきではありません!
    結合性(associativity)の値に取るべき値はleft,right,noneである.左結合演算子は、他の優先度が同じ左結合演算子と一緒に書くと、左のオペランドと結合します.同様に、右結合演算子は右のオペランドと結合します.結合演算子ではなく、他の同じ優先度の演算子と一緒に書くことはできません.デフォルトの優先度は100です.
    infix operator **= { associativity left precedence 140 }
    fun ** (base:Int,exponent:Int)
     {
    
    }