diff --git a/Source/ConstraintDescription.swift b/Source/ConstraintDescription.swift index 14ea3fa..f3a137c 100644 --- a/Source/ConstraintDescription.swift +++ b/Source/ConstraintDescription.swift @@ -27,41 +27,85 @@ import UIKit import AppKit #endif -// Reduce duplication by centralizing casts -public protocol FloatConvertible { +// Type of object that can be a target of relation constraint. +// Doesn't cover system protocols which can't be extended with additional conformances. +public protocol RelationTarget { + var constraintItem : ConstraintItem { get } +} + +// Type of things that can be converted to floats. Used to provide a catch all for +// different numeric types. +public protocol FloatConvertible : RelationTarget { var floatValue : Float { get } } -extension Float : FloatConvertible { +extension FloatConvertible { + public var constraintItem : ConstraintItem { + return ConstraintItem(object: nil, attributes: ConstraintAttributes.None) + } +} + +extension Float : FloatConvertible, RelationTarget { public var floatValue : Float { return self } } -extension Int : FloatConvertible { +extension Int : FloatConvertible, RelationTarget { public var floatValue : Float { return Float(self) } } -extension UInt : FloatConvertible { +extension UInt : FloatConvertible, RelationTarget { public var floatValue : Float { return Float(self) } } -extension Double : FloatConvertible { +extension Double : FloatConvertible, RelationTarget { public var floatValue : Float { return Float(self) } } -extension CGFloat : FloatConvertible { +extension CGFloat : FloatConvertible, RelationTarget { public var floatValue : Float { return Float(self) } } +@available(iOS 9.0, OSX 10.11, *) +extension NSLayoutAnchor : RelationTarget { + public var constraintItem : ConstraintItem { + return ConstraintItem(object: self, attributes: ConstraintAttributes.None) + } +} + +extension CGPoint : RelationTarget { + public var constraintItem : ConstraintItem { + return ConstraintItem(object: nil, attributes: ConstraintAttributes.None) + } +} + +extension CGSize : RelationTarget { + public var constraintItem : ConstraintItem { + return ConstraintItem(object: nil, attributes: ConstraintAttributes.None) + } +} + +extension EdgeInsets : RelationTarget { + public var constraintItem : ConstraintItem { + return ConstraintItem(object: nil, attributes: ConstraintAttributes.None) + } +} + +extension View : RelationTarget { + public var constraintItem : ConstraintItem { + return ConstraintItem(object: self, attributes: ConstraintAttributes.None) + } +} + /** Used to expose the final API of a `ConstraintDescription` which allows getting a constraint from it */ @@ -107,38 +151,19 @@ public protocol ConstraintDescriptionEditable: ConstraintDescriptionPriortizable public protocol ConstraintDescriptionRelatable: class { func equalTo(other: ConstraintItem) -> ConstraintDescriptionEditable - func equalTo(other: View) -> ConstraintDescriptionEditable + func equalTo(other: RelationTarget) -> ConstraintDescriptionEditable @available(iOS 7.0, *) func equalTo(other: LayoutSupport) -> ConstraintDescriptionEditable - @available(iOS 9.0, OSX 10.11, *) - func equalTo(other: NSLayoutAnchor) -> ConstraintDescriptionEditable - func equalTo(other: FloatConvertible) -> ConstraintDescriptionEditable - func equalTo(other: CGSize) -> ConstraintDescriptionEditable - func equalTo(other: CGPoint) -> ConstraintDescriptionEditable - func equalTo(other: EdgeInsets) -> ConstraintDescriptionEditable func lessThanOrEqualTo(other: ConstraintItem) -> ConstraintDescriptionEditable - func lessThanOrEqualTo(other: View) -> ConstraintDescriptionEditable + func lessThanOrEqualTo(other: RelationTarget) -> ConstraintDescriptionEditable @available(iOS 7.0, *) func lessThanOrEqualTo(other: LayoutSupport) -> ConstraintDescriptionEditable - @available(iOS 9.0, OSX 10.11, *) - func lessThanOrEqualTo(other: NSLayoutAnchor) -> ConstraintDescriptionEditable - func lessThanOrEqualTo(other: FloatConvertible) -> ConstraintDescriptionEditable - func lessThanOrEqualTo(other: CGSize) -> ConstraintDescriptionEditable - func lessThanOrEqualTo(other: CGPoint) -> ConstraintDescriptionEditable - func lessThanOrEqualTo(other: EdgeInsets) -> ConstraintDescriptionEditable func greaterThanOrEqualTo(other: ConstraintItem) -> ConstraintDescriptionEditable - func greaterThanOrEqualTo(other: View) -> ConstraintDescriptionEditable + func greaterThanOrEqualTo(other: RelationTarget) -> ConstraintDescriptionEditable @available(iOS 7.0, *) func greaterThanOrEqualTo(other: LayoutSupport) -> ConstraintDescriptionEditable - @available(iOS 9.0, OSX 10.11, *) - func greaterThanOrEqualTo(other: NSLayoutAnchor) -> ConstraintDescriptionEditable - func greaterThanOrEqualTo(other: FloatConvertible) -> ConstraintDescriptionEditable - func greaterThanOrEqualTo(other: CGSize) -> ConstraintDescriptionEditable - func greaterThanOrEqualTo(other: CGPoint) -> ConstraintDescriptionEditable - func greaterThanOrEqualTo(other: EdgeInsets) -> ConstraintDescriptionEditable - } /** @@ -226,87 +251,39 @@ internal class ConstraintDescription: ConstraintDescriptionExtendable, Constrain internal func equalTo(other: ConstraintItem) -> ConstraintDescriptionEditable { return self.constrainTo(other, relation: .Equal) } - internal func equalTo(other: View) -> ConstraintDescriptionEditable { + internal func equalTo(other: RelationTarget) -> ConstraintDescriptionEditable { return self.constrainTo(other, relation: .Equal) } @available(iOS 7.0, *) internal func equalTo(other: LayoutSupport) -> ConstraintDescriptionEditable { return self.constrainTo(other, relation: .Equal) } - @available(iOS 9.0, OSX 10.11, *) - internal func equalTo(other: NSLayoutAnchor) -> ConstraintDescriptionEditable { - return self.constrainTo(other, relation: .Equal) - } - internal func equalTo(other: FloatConvertible) -> ConstraintDescriptionEditable { - return self.constrainTo(other, relation: .Equal) - } - internal func equalTo(other: CGSize) -> ConstraintDescriptionEditable { - return self.constrainTo(other, relation: .Equal) - } - internal func equalTo(other: CGPoint) -> ConstraintDescriptionEditable { - return self.constrainTo(other, relation: .Equal) - } - internal func equalTo(other: EdgeInsets) -> ConstraintDescriptionEditable { - return self.constrainTo(other, relation: .Equal) - } // MARK: lessThanOrEqualTo internal func lessThanOrEqualTo(other: ConstraintItem) -> ConstraintDescriptionEditable { return self.constrainTo(other, relation: .LessThanOrEqualTo) } - internal func lessThanOrEqualTo(other: View) -> ConstraintDescriptionEditable { + internal func lessThanOrEqualTo(other: RelationTarget) -> ConstraintDescriptionEditable { return self.constrainTo(other, relation: .LessThanOrEqualTo) } @available(iOS 7.0, *) internal func lessThanOrEqualTo(other: LayoutSupport) -> ConstraintDescriptionEditable { return self.constrainTo(other, relation: .LessThanOrEqualTo) } - @available(iOS 9.0, OSX 10.11, *) - internal func lessThanOrEqualTo(other: NSLayoutAnchor) -> ConstraintDescriptionEditable { - return self.constrainTo(other, relation: .LessThanOrEqualTo) - } - internal func lessThanOrEqualTo(other: FloatConvertible) -> ConstraintDescriptionEditable { - return self.constrainTo(other, relation: .LessThanOrEqualTo) - } - internal func lessThanOrEqualTo(other: CGSize) -> ConstraintDescriptionEditable { - return self.constrainTo(other, relation: .LessThanOrEqualTo) - } - internal func lessThanOrEqualTo(other: CGPoint) -> ConstraintDescriptionEditable { - return self.constrainTo(other, relation: .LessThanOrEqualTo) - } - internal func lessThanOrEqualTo(other: EdgeInsets) -> ConstraintDescriptionEditable { - return self.constrainTo(other, relation: .LessThanOrEqualTo) - } // MARK: greaterThanOrEqualTo internal func greaterThanOrEqualTo(other: ConstraintItem) -> ConstraintDescriptionEditable { return self.constrainTo(other, relation: .GreaterThanOrEqualTo) } - internal func greaterThanOrEqualTo(other: View) -> ConstraintDescriptionEditable { + internal func greaterThanOrEqualTo(other: RelationTarget) -> ConstraintDescriptionEditable { return self.constrainTo(other, relation: .GreaterThanOrEqualTo) } @available(iOS 7.0, *) internal func greaterThanOrEqualTo(other: LayoutSupport) -> ConstraintDescriptionEditable { return self.constrainTo(other, relation: .GreaterThanOrEqualTo) } - @available(iOS 9.0, OSX 10.11, *) - internal func greaterThanOrEqualTo(other: NSLayoutAnchor) -> ConstraintDescriptionEditable { - return self.constrainTo(other, relation: .LessThanOrEqualTo) - } - internal func greaterThanOrEqualTo(other: FloatConvertible) -> ConstraintDescriptionEditable { - return self.constrainTo(other, relation: .GreaterThanOrEqualTo) - } - internal func greaterThanOrEqualTo(other: CGSize) -> ConstraintDescriptionEditable { - return self.constrainTo(other, relation: .GreaterThanOrEqualTo) - } - internal func greaterThanOrEqualTo(other: CGPoint) -> ConstraintDescriptionEditable { - return self.constrainTo(other, relation: .GreaterThanOrEqualTo) - } - internal func greaterThanOrEqualTo(other: EdgeInsets) -> ConstraintDescriptionEditable { - return self.constrainTo(other, relation: .GreaterThanOrEqualTo) - } // MARK: multiplier @@ -456,18 +433,13 @@ internal class ConstraintDescription: ConstraintDescriptionExtendable, Constrain return self } - private func constrainTo(other: View, relation: ConstraintRelation) -> ConstraintDescription { - return constrainTo(ConstraintItem(object: other, attributes: ConstraintAttributes.None), relation: relation) + private func constrainTo(other: RelationTarget, relation: ConstraintRelation) -> ConstraintDescription { + return constrainTo(other.constraintItem, relation: relation) } @available(iOS 7.0, *) private func constrainTo(other: LayoutSupport, relation: ConstraintRelation) -> ConstraintDescription { - return constrainTo(ConstraintItem(object: other, attributes: ConstraintAttributes.None), relation: relation) - } - - @available(iOS 9.0, OSX 10.11, *) - private func constrainTo(other: NSLayoutAnchor, relation: ConstraintRelation) -> ConstraintDescription { - return constrainTo(ConstraintItem(object: other, attributes: ConstraintAttributes.None), relation: relation) + return constrainTo(ConstraintItem(object: self, attributes: ConstraintAttributes.None), relation: relation) } private func constrainTo(other: FloatConvertible, relation: ConstraintRelation) -> ConstraintDescription { @@ -475,18 +447,4 @@ internal class ConstraintDescription: ConstraintDescriptionExtendable, Constrain return constrainTo(ConstraintItem(object: nil, attributes: ConstraintAttributes.None), relation: relation) } - private func constrainTo(other: CGSize, relation: ConstraintRelation) -> ConstraintDescription { - self.constant = other - return constrainTo(ConstraintItem(object: nil, attributes: ConstraintAttributes.None), relation: relation) - } - - private func constrainTo(other: CGPoint, relation: ConstraintRelation) -> ConstraintDescription { - self.constant = other - return constrainTo(ConstraintItem(object: nil, attributes: ConstraintAttributes.None), relation: relation) - } - - private func constrainTo(other: EdgeInsets, relation: ConstraintRelation) -> ConstraintDescription { - self.constant = other - return constrainTo(ConstraintItem(object: nil, attributes: ConstraintAttributes.None), relation: relation) - } }