如何在Swift中测试变量的类?

iel*_*ani 26 ios swift

我想检查数组的元素是否是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?"})
Run Code Online (Sandbox Code Playgroud)

没有桥接到目标c.

Jes*_*sak 50

Swift有is运算符来测试值的类型:

var onlyUILabels = myArray.filter { $0 is UILabel }
Run Code Online (Sandbox Code Playgroud)

作为旁注,这仍然会产生一个Array<UIView>,而不是Array<UILabel>.从Swift 2 beta系列开始,您可以使用flatMap:

var onlyUILabels = myArray.flatMap { $0 as? UILabel }
Run Code Online (Sandbox Code Playgroud)

以前(斯威夫特1),你可以演员,虽然有效,但感觉有点难看.

var onlyUILabels = myArray.filter { $0 is UILabel } as! Array<UILabel>
Run Code Online (Sandbox Code Playgroud)

或者你需要一些方法来建立一个标签列表.但是,我没有看到任何标准.也许是这样的:

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 }
Run Code Online (Sandbox Code Playgroud)


wot*_*pal 7

在Swift中,is如果您想了解相关类,则应该使用关键字.在filter-closure中,您可以使用$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"]
Run Code Online (Sandbox Code Playgroud)