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

26

我想检查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?"})

不需要与 Objective-C 进行桥接。

4个回答

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 }

谢谢,它可以工作了,但是我无法在playground中使用变量onlyUILabels.count记录onlyUILabels的数量,你有什么想法吗? - ielyamani
也许你可以提一个新问题?如果我在我的 playground 最后加上 onlyUILabels.count 作为新行,它会返回 1。(但有时会崩溃;这个测试版可能存在一些不稳定性。) - Jesse Rusak

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"]

1
“尾随闭包语法”在 myArray.filter { $0 is String } 中非常有用。 - GoZoner
你说得对,我刚刚是从上面复制了例子。 - Dennis Zoma

3

在Swift中,即使没有达到object.class()的境界,我们仍然可以使用Objective-C Runtime来获取关于对象类的一些有用信息,如下所示(而不是直接与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

谢谢,这非常有用。 - ielyamani

0
你可以在Swift中使用以下方式来比较类:
 return object.dynamicType == otherObject.dynamicType

dynamicType会返回一个Class的实例,您可以进行比较


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接