Я хочу объединить 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, но я не уверен, как это исправить ...
Спасибо за ваше время