[Swift] 演算子のオーバーロード

Swiftでは演算子をオーバーロード可能です。

下記のクラスOkozukaiに幾つかの演算子を定義してみます。

// お小遣いクラス
class Okozukai {
    var okane = 0
    init(okane:Int){
        self.okane = okane
    }
}

 
C = A + B のような演算子を定義する時は @infix を付けて宣言します
※演算子のオーバーロードは全てFileスコープ(classとかの外側、グローバル)に宣言する必要があります。

// +(プラス)を宣言
func + (left: Okozukai, right: Okozukai) -> Okozukai {
    return Okozukai(okane: left.okane + right.okane)
}

// == と !=演算子 
func == (left: Okozukai, right: Okozukai) ->  Bool {
    return left.okane == right.okane
}
// != は明示的に宣言しなきゃダメみたい(==から逆判定はしてくれない)
func != (left: Okozukai, right: Okozukai) ->  Bool {
    return left.okane != right.okane
}

このように宣言すると下記のようにOkozukaiクラスが計算できます

let kozukaiA = Okozukai(okane:1000)
let kozukaiB = Okozukai(okane:2000)

var kozukaiC = kozukaiA + kozukaiB

if (kozukaiC == Okozukai(okane:3000)){
   NSLog("kozukaiCは3000円")
}

 

A += B のような演算子を定義する時は @assignment を付けて宣言します
第1引数がinoutなので注意

// "+="を宣言
func += (inout left: Okozukai, right: Okozukai) {
    left = left + right
}
// オーバーロードも出来る
func += (inout left: Okozukai, right: Int) {
    left = left + Okozukai(okane:right)
}

let kozukaiA = Okozukai(okane:1000)
kozukaiA += 1000
kozukaiA += Okozukai(okane:500)
NSLog("小遣い:\(kozukaiA.okane)")
// 小遣い:2500

 

prefixを指定すると -a のような演算子を宣言できます。
※同様に postfixだと a- のような演算子

prefix func - (oz:Okozukai) -> Okozukai{
    return Okozukai(okane:oz.okane * -1)
}

let kozukaiA = Okozukai(okane:1000)
let minusOkozukai = -kozukaiA
NSLog("小遣い:\(minusOkozukai.okane)")
// 小遣い:-1000

 

++a のような自身に対しての演算を行う場合

prefix func ++ (inout okozukai:Okozukai) -> Okozukai{
    okozukai.okane += 1000
    return okozukai
}

let kozukaiA = Okozukai(okane:1000)
++kozukaiA
NSLog("小遣い:\(kozukaiA.okane)")
// 小遣い:2000

(2014-08-26) beta5で色々変わっていたのでサンプルコードを修正

コメントを残す

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