我想用以下签名编写一个函数:
func viewHasSuperviewOfClass(view: UIView, superclass: AnyObject.Type) -> Bool {
return view.superview is superclass
}
但它不会编译。我究竟做错了什么?如何传递超类并将其视为参数?
答案 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)