如何在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将返回您可以比较的类的一个实例