Swift 算術加算演算子のオーバーロード

sample1-1

let int1:Int=10
let int2:Int=20
let plus:Int=int1+int2
print(plus)
30

sample1-1は、Int型の変数int1,int2に値をセットして+演算子(算術加算演算子)で加算して結果を表示する、という何の変哲もないコードです。まさに何の変哲もないのですが、

つまり+演算子に関して我々が全く何の実装もせずに、当たり前に加算が行われている、ということですね。

このようにInt型ではプログラマは+演算子に関して何も実装せずとも、普通に加算が行われるわけですが、これが自分で作った型の場合はどうか。


sample1-2

struct Container {
    var width:Int=0
    var height:Int=0
}

let con1=Container(width:10,height:20)
let con2=Container(width:20,height:30)

print(con1+con2)

 

main.swift:17:11: error: binary operator '+' cannot be applied to two 'Container' operands
print(con1+con2)
      ~~~~^~~~~

 

sample1-2では2つのInt型のプロパティwidth,heightを持つContainer構造体を定義しています。そしてインスタンスを二つ生成し、定数con1,con2にセット。

そしてcon1+con2としています。

これでcon1とcon2のwidthプロパティ同士の和をwidthプロパティに、

con1とcon2のheightプロパティ同士の和をheightプロパティに持つ新しいContainerインスタンスが返されれば便利なんですが。

結果はエラーが出ます。

Int型,Float型などの組み込み型ではない、独自の型で+演算子(算術加算演算子)を使いたい場合、その独自の型に「演算子メソッド」を定義する必要があります。(sample2-1)

struct Container {
    var width:Int=0
    var height:Int=0
}

extension Container{
    static func +(left:Container,right:Container)->Container{
        return Container(width:left.width+right.width,height:left.height+right.height)
    }
}


let con1=Container(width:10,height:20)
let con2=Container(width:20,height:30)

print(con1+con2)
Container(width: 30, height: 50)

sample2-1の7~9行目が演算子メソッドの定義です。

演算子メソッドは、オーバーロードする演算子(+)をメソッド名としてstaticメソッドとして定義します。

 

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です