Обобщения для консолидации NSLayoutAnchor - PullRequest
0 голосов
/ 05 сентября 2018

Я хочу объединить NSLayoutDimension NSLayoutXAxisAnchor и NSLayoutYAxisAnchor, чтобы создать оболочку для моих якорей, чтобы избежать длинного списка удобных методов

Идеальный синтаксис, который я искал, был

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
    }
}

Но вот где я немного теряюсь ... на самом деле это не так уж и много ... в идеале я бы хотел собрать все Якоря в одном месте, т.е. развернуть equivalent, чтобы я мог легкий доступ к якорям на основе одного и того же запроса.

это возможно с NSLayoutAttribute

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

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

однако он не работает с обобщениями, как у меня выше ... Я знаю, что синтаксис неправильный, и что якоря являются свойствами на UIView s, но я не уверен, как это исправить ...

Спасибо за ваше время

...