如何在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的数据源。
感谢。
答案 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