Property for Double and CGFloat

Suppose I want a property to tell me whether an arbitrary number is an integer. If the number is a Double, I can just use this:


extension Double {
  var isInteger: Bool {
  return Double(self) == Double(Int(self))
  }
}


Of course I can make the same extension for CGFloat, or just cast a CGFloat to a Double. That's easy enough, but I'm curious: Is there a way of defining a function that will work for both Double and CGFloat without a cast? I've been working my way through the Protocols chapter of The Swift Programming Language and I'm wondering if there's a way of doing it with a protocol.

Replies

It's not easy under the current Swift type system.

My best proposal is something like this:

protocol IntegerCheckableFloatType: FloatLiteralConvertible, Equatable {
    func % (lhs: Self, rhs: Self) -> Self
    var isInteger: Bool {get}
}
extension IntegerCheckableFloatType {
    var isInteger: Bool {
        return self % 1.0 == 0.0 as Self
    }
}
extension Double: IntegerCheckableFloatType {}
extension CGFloat: IntegerCheckableFloatType {}
extension Float: IntegerCheckableFloatType {}
(123.4).isInteger //->false
(123.0).isInteger //->true