合并NSLayoutAnchor的泛型

时间:2018-09-05 04:41:59

标签: swift generics nslayoutanchor

我想合并NSLayoutDimension NSLayoutXAxisAnchorNSLayoutYAxisAnchor来为锚创建一个包装器,以避免一长串便捷方法

我正在寻找的理想语法是

extension UIView {

    func example() {
        attach("width" to:view, "height")
    }

    func attach(_ value:String to view:UIView, _ otherValue:String) -> NSLayoutConstraint {

         let firstAnchor = anchor(for:value)
         let secondAnchor = anchor(for:otherValue)

         return firstAnchor.match(view.secondAnchor)
    }

    // My original expectation for generics

    func anchor<A: NSLayoutAnchor<AnyObject>>(for string:String) -> A {

        switch string {
        case "height":
            return heightAnchor
        default:
            return widthAnchor
        }
        // etc....
    }

    extension NSLayoutAnchor {
        func match(_ anchor:NSLayoutAnchor) -> NSLayoutConstraint {

            return constraint(equalTo: view.anchor)        
        }
    }

我似乎最接近的人是...

func equivalent(_ dimension: NSLayoutDimension) -> NSLayoutDimension {

    switch dimension {
    case heightAnchor:
        return heightAnchor
    default:
        return widthAnchor
    }
}

但是在这里我有点迷路了……这实际上并没有取得太大的成就……理想情况下,我想将所有的Anchors放在一个位置,即展开equivalent,以便我可以根据相同的查询轻松访问锚点。

NSLayoutAttribute可能是这样

func attribute(for string:String) -> NSLayoutAttribute {

    switch string {
    case "left":
        return .left
    case "right":
        return .right

但是它不能与泛型一起使用,因为上面有它们……我知道语法是错误的,并且锚点是UIView上的属性,但是我不确定如何解决。 ..

感谢您的时间

0 个答案:

没有答案