2017-05-02 11 views
-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

다음은 내가 사용하는 확장 프로그램입니다. 최대/최소 접근 대신 중첩 된 조건을 사용합니다. 이렇게하면 잠재적으로 분기 중 하나를 단락시킬 수있어 성능을 향상시킬 수 있습니다 (중요한 경우).

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

답변 해 주셔서 감사합니다. –