如何在Swift中将类作为参数传递?

时间:2016-12-13 03:18:03

标签: swift

我想用以下签名编写一个函数:

func viewHasSuperviewOfClass(view: UIView, superclass: AnyObject.Type) -> Bool {
    return view.superview is superclass
}

但它不会编译。我究竟做错了什么?如何传递超类并将其视为参数?

1 个答案:

答案 0 :(得分:1)

superclass作为AnyClass传递并使用isKind(of:)进行测试:

func viewHasSuperviewOfClass(view: UIView, superclass: AnyClass) -> Bool {
    return view.superview?.isKind(of: superclass) ?? false
}

由于view.superview是可选的,您需要打开它。如果没有超级视图,使用可选链接将返回nil,因此如果存在,请使用 nil coalescing operator ??返回false不是superview

示例:

let button = UIButton()
let label = UILabel()
label.addSubview(button)

viewHasSuperviewOfClass(view: button, superclass: UILabel.self)  // true
viewHasSuperviewOfClass(view: label, superclass: UIButton.self)  // false

如果您使用此函数签名,它会更好一些:

func view(_ view: UIView, hasSuperviewOfClass superclass: AnyClass) -> Bool {
    return view.superview?.isKind(of: superclass) ?? false
}

// example call
view(button, hasSuperviewOfClass: UILabel.self)