如何在Swift中testing一个variables的类?

我想检查数组的元素是否是Swift中UILabel的子类:

import UIKit var u1 = UILabel() u1.text="hello" var u2 = UIView(frame: CGRectMake(0, 0, 200, 20)) var u3 = UITableView(frame: CGRectMake(0, 20, 200, 80)) var myArray = [u1, u2, u3] var onlyUILabels = myArray.filter({"what to put here?"}) 

没有桥接到客观-c。

Swift有is运算符来testing一个值的types:

 var onlyUILabels = myArray.filter { $0 is UILabel } 

作为一个方面说明,这仍然会产生一个Array<UIView> ,而不是Array<UILabel> 。 从Swift 2 beta系列开始,你可以使用flatMap来实现:

 var onlyUILabels = myArray.flatMap { $0 as? UILabel } 

以前(斯威夫特1),你可以投,这有效,但感觉有点难看。

 var onlyUILabels = myArray.filter { $0 is UILabel } as! Array<UILabel> 

否则你需要一些方法来build立一个标签列表。 虽然我没有看到任何标准。 也许是这样的:

 extension Array { func mapOptional<U>(f: (T -> U?)) -> Array<U> { var result = Array<U>() for original in self { let transformed: U? = f(original) if let transformed = transformed { result.append(transformed) } } return result } } var onlyUILabels = myArray.mapOptional { $0 as? UILabel } 

在Swift中,如果你想知道相关的类,你应该使用is关键字。 在filter您可以使用$0来指定第一个参数。

样品

 var (a,b,c,d) = ("String", 42, 10.0, "secondString") let myArray: Array<Any> = [a,b,c,d] var onlyStrings = myArray.filter({ return $0 is String }) onlyStrings // ["String", "secondString"] 

在Swift中,我们仍然可以使用Objective-C运行时获取关于对象类的一些有用信息(而不是完全桥接到Objective-C):

 let objectClass: AnyClass = object_getClass(object) as AnyClass let objectClassName = NSStringFromClass(objectClass) println("Class = \(objectClassName)") 

请注意,我们得到“MyProject”。 或者(有时)是“Swift”。 前缀,取决于如果你引用你自己的类或Swift类:

 UILabel // UILabel Swift._NSSwiftArrayImpl //Swift Array MyProject.Customer_Customer_ //for a CoreData class named Customer 

你可以用swift比较下面的类:

  return object.dynamicType == otherObject.dynamicType 

dynamicType将返回您可以比较的类的一个实例