我想检查一下Array的元素是否是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。
答案 0 :(得分:50)
Swift有is
运算符来测试值的类型:
var onlyUILabels = myArray.filter { $0 is UILabel }
作为旁注,这仍然会产生Array<UIView>
,而不是Array<UILabel>
。从Swift 2 beta系列开始,您可以使用flatMap:
var onlyUILabels = myArray.flatMap { $0 as? UILabel }
以前(Swift 1),你可以演员,虽然有效,但感觉有点难看。
var onlyUILabels = myArray.filter { $0 is UILabel } as! Array<UILabel>
否则你需要一些方法来建立一个只有标签的列表。但是,我没有看到任何标准。也许是这样的:
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 }
答案 1 :(得分:7)
在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"]
答案 2 :(得分:3)
在Swift中没有访问object.class()nirvana,我们仍然可以使用Objective-C Runtime获取有关对象类的一些有用信息,如下所示(并不完全桥接到Objective-C):
let objectClass: AnyClass = object_getClass(object) as AnyClass
let objectClassName = NSStringFromClass(objectClass)
println("Class = \(objectClassName)")
请注意,我们获得了“MyProject”。或(有时)“斯威夫特”。前缀,取决于您是否引用自己的类或Swift类:
UILabel // UILabel
Swift._NSSwiftArrayImpl //Swift Array
MyProject.Customer_Customer_ //for a CoreData class named Customer
答案 3 :(得分:0)
您可以在swift中使用以下内容比较类:
return object.dynamicType == otherObject.dynamicType
dynamicType将返回您可以比较的Class实例