0
我想編寫一個函數與下面的簽名:如何在Swift中將類作爲參數傳遞?
func viewHasSuperviewOfClass(view: UIView, superclass: AnyObject.Type) -> Bool {
return view.superview is superclass
}
但它不會編譯。我究竟做錯了什麼?如何傳遞超類並將其作爲參數處理?
我想編寫一個函數與下面的簽名:如何在Swift中將類作爲參數傳遞?
func viewHasSuperviewOfClass(view: UIView, superclass: AnyObject.Type) -> Bool {
return view.superview is superclass
}
但它不會編譯。我究竟做錯了什麼?如何傳遞超類並將其作爲參數處理?
傳遞superclass
爲AnyClass
和使用isKind(of:)
進行測試:
func viewHasSuperviewOfClass(view: UIView, superclass: AnyClass) -> Bool {
return view.superview?.isKind(of: superclass) ?? false
}
由於view.superview
是可選的,你需要解開它。如果沒有超視圖,使用10可選鏈接將返回nil
,因此如果沒有superview
,則使用無合併運算符??
返回false
。
例子:
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)
@ DougSmith,爲你做了這項工作? – vacawama
嘗試使用view.superview.isKindOfClass – koropok