2016-12-13 34 views
0

我想編寫一個函數與下面的簽名:如何在Swift中將類作爲參數傳遞?

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

但它不會編譯。我究竟做錯了什麼?如何傳遞超類並將其作爲參數處理?

+0

嘗試使用view.superview.isKindOfClass – koropok

回答

1

傳遞superclassAnyClass和使用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) 
+0

@ DougSmith,爲你做了這項工作? – vacawama

相關問題