2016-12-13 6 views
0

私は以下のシグネチャを持つ関数を書きたい:クラスをSwiftのパラメータとして渡すにはどうすればよいですか?

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

しかし、それはコンパイルされません。私は間違って何をしていますか?どのようにスーパークラスを渡して、それをパラメータとして扱うのですか?

+0

はview.superview.isKindOfClass – koropok

答えて

1

AnyClassとしてsuperclassをパスし、それをテストするためにisKind(of:)を使用します。view.superviewはあなたがそれをアンラップする必要が任意であるので

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

を。使用オプションなしスーパービューがない場合はnilを返し、そう何superviewがない場合はfalseを返すために、オペレータ??を合体nilをを使用します連鎖。


例:

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

関連する問題