Pebble's Diary

プログラマーの作業メモ

swift3 IntegerArithmaticプロトコル

IntegerArithmeticプロトコルを実装するには、以下8つの関数を定義する必要がある。 最初の2つはComparableである。

static func ==(lhs: M, rhs: M) -> Bool
static func <(lhs: M, rhs: M) -> Bool
static func addWithOverflow(_ lhs: M, _ rhs: M) -> (M, overflow: Bool) 
static func subtractWithOverflow(_ lhs: M, _ rhs: M) -> (M, overflow: Bool) 
static func multiplyWithOverflow(_ lhs: M, _ rhs: M) -> (M, overflow: Bool) 
static func divideWithOverflow(_ lhs: M, _ rhs: M) -> (M, overflow: Bool) 
static func remainderWithOverflow(_ lhs: M, _ rhs: M) -> (M, overflow: Bool) 
func toIntMax() -> IntMax

最後の一つはswiftの最大Int(=UInt64)へ変換するものである。 このプロトコルを実装すると以下の5つの演算や関連する演算ができるようになる。

public static func +(lhs: Self, rhs: Self) -> Self
public static func -(lhs: Self, rhs: Self) -> Self
public static func *(lhs: Self, rhs: Self) -> Self
public static func /(lhs: Self, rhs: Self) -> Self
public static func %(lhs: Self, rhs: Self) -> Self

このプロトコルを用いると、通常とは異なる演算規則を持つ整数を作ることができる。 複素整数や桁数が無制限の整数などを自作することができる。