2017-05-02 12 views
-1

私は範囲をminとmaxで値にバインドするのに役立つ1つの拡張子を持っています。 Int、Float、Double、CGFloatのような別のタイプを使用する必要があるシナリオがいくつかあります。それで、私は以下のような複数の拡張を作成しました。だから、Int、Double、CGFloatの一般的な拡張を作成します

extension Int { 
    func clamp(min: Int, _ max: Int) -> Int { 
     return Swift.max(min, Swift.min(max, self)) 
    } 
} 

extension CGFloat { 
    func clamp (min: CGFloat, _ max: CGFloat) -> CGFloat { 
     return Swift.max(min, Swift.min(max, self)) 
    } 
} 

、どのように私は数値のみをとることが確認ジェネリック型Tを使用して、それがより一般的なことができますか?

答えて

1

ここに私が使用する拡張機能があります。これは、最大/最小のアプローチの代わりにネストされた条件を使用します。これにより、ブランチの1つを短絡させる可能性があり、性能を向上させることができます(重要な場合)。

extension Comparable { 
    func clamped(to r: ClosedRange<Self>) -> Self { 
     let min = r.lowerBound, max = r.upperBound 
     return self < min ? min : (max < self ? max : self) 
    } 
} 

10.clamped(to: 0...5) // => 5 
+0

回答ありがとうございます。 –

関連する問題