如何使用向下转换迭代Swift [AnyObject]数组?

时间:2015-05-28 10:26:30

标签: arrays swift cocoa

如何在Swift中循环遍历AnyObjects数组并同时向下转发到相应的类?我可以像这样详细地做,但我似乎无法找到一种方法来做到这一点,如果没有“if let”在循环内:

func tableView(tableView: NSTableView, sortDescriptorsDidChange oldDescriptors: [AnyObject]) {
    var currentSort = tableView.sortDescriptors
    for s in currentSort {
        if let ss = s as? NSSortDescriptor {
            println("keyPath: \(ss.key()), ascending: \(ss.ascending)")
        }
    }
}

我正在尝试为自定义对象数组实现排序,这是NSTableView的数据源。

感谢。

1 个答案:

答案 0 :(得分:5)

如果[AnyObject]的数组应该是完全由您想要的类型组成,那么您可以进行大规模投射:

func tableView(tableView: NSTableView, sortDescriptorsDidChange oldDescriptors: [AnyObject]) {
    let currentSort = tableView.sortDescriptors as? [NSSortDescriptor]
    for s in currentSort ?? [] {
        println("keyPath: \(s.key()), ascending: \(s.ascending)")
    }
}

如果[]中有一个或多个nil不是正确的类型,那么使用AnyObject替换空数组代替if…else - 您还需要如果您想要显式错误处理而不是静默失败,请as!

或者,如果您希望程序在发生故障时陷阱,可以使用let x: Int? = 1 if let x = x { println(x) } ,但如果您在生产中发现这一点,那将是一种耻辱。

顺便说一句,如果您必须为解开的值提出一个新名称这一事实是困扰您的一部分,您可以给它起相同的名称:

x

声明了一个本地展开的x,它掩盖了if中的外mapSome

如果某些但不是全部可能属于正确的类型而你只想对它们进行操作,那么extension Array { func mapSome<U>(transform: T->U?) -> [U] { return lazy(self).map(transform) .filter { $0 != nil } .map { $0! }.array } } func tableView(tableView: NSTableView, sortDescriptorsDidChange oldDescriptors: [AnyObject]) { let currentSort = tableView.sortDescriptors.mapSome { $0 as? NSSortDescriptor } for s in currentSort { println("keyPath: \(s.key()), ascending: \(s.ascending)") } } 是一个方便的数组扩展:

A