我想做一些类似的事情:
public enum LayoutEdge
{
case top
case right
...
}
func anchorForLayoutEdge(_ edge : LayoutEdge) -> NSLayoutAnchor {
switch edge
{
case .top: return topAnchor
case .right: return rightAnchor
...
}
}
public func constrain_edge(_ edge : LayoutEdge,
toEdge : LayoutEdge,
view : UIView) -> NSLayoutConstraint{
let a1 = anchorForLayoutEdge(edge)
let a2 = anchorForLayoutEdge(toEdge)
return a1.constraint(equalTo: a2))
}但是这不能编译。在anchorForLayoutEdge中失败。Xcode建议将返回类型更改为NSLayoutAnchor,这似乎是错误的。如何才能使它根据指定的边返回正确的NSLayoutXAxisAnchor或NSLayoutYAxisAnchor?
发布于 2017-05-19 17:25:17
Swift需要能够在编译时确定类型,但是您尝试根据传递的edge参数返回NSLayoutAnchor<NSLayoutXAxisAnchor>或NSLayoutAnchor<NSLayoutYAxisAnchor>对象。
你可以做的是将你的边分割成与x轴和y轴相关的边:
extension UIView
{
public enum XLayoutEdge {
case right
// ...
}
public enum YLayoutEdge {
case top
// ...
}
func anchor(for edge: XLayoutEdge) -> NSLayoutAnchor<NSLayoutXAxisAnchor> {
switch edge
{
case .right: return rightAnchor
// ...
}
}
func anchor(for edge: YLayoutEdge) -> NSLayoutAnchor<NSLayoutYAxisAnchor> {
switch edge
{
case .top: return topAnchor
// ...
}
}
public func constrain(edge edge1: XLayoutEdge, to edge2: XLayoutEdge, of view: UIView) -> NSLayoutConstraint {
return anchor(for: edge1).constraint(equalTo: view.anchor(for: edge2))
}
public func constrain(edge edge1: YLayoutEdge, to edge2: YLayoutEdge, of view: UIView) -> NSLayoutConstraint {
return anchor(for: edge1).constraint(equalTo: view.anchor(for: edge2))
}
func useEdges(view: UIView)
{
_ = constrain(edge: .right, to: .right, of: view)
_ = constrain(edge: .top, to: .top, of: view)
}
}情况会变得更糟,因为你也必须考虑NSLayoutDimension。您可以玩弄泛型,但最终可能会以某种方式复制Apple已经为您准备好的东西:)。
这就是为什么我认为你在这里与系统背道而驰。后退一步,为什么不直接使用锚点呢?
extension UIView
{
func useAnchors(view: UIView)
{
_ = rightAnchor.constraint(equalTo: view.rightAnchor)
_ = topAnchor.constraint(equalTo: view.bottomAnchor)
}
}如果你想编写你自己的便利函数,你可以这样做:
extension UIView
{
public func constrain<T>(_ anchor1: NSLayoutAnchor<T>, to anchor2: NSLayoutAnchor<T>) -> NSLayoutConstraint {
return anchor1.constraint(equalTo: anchor2)
}
func useYourOwnFunctions(view: UIView)
{
_ = constrain(rightAnchor, to: view.rightAnchor)
_ = constrain(topAnchor, to: view.bottomAnchor)
}
}https://stackoverflow.com/questions/44061108
复制相似问题