Mar*_*rby 2 arrays cocoa swift
如何在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)")
}
}
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试为自定义对象数组实现排序,这是NSTableView的数据源.
谢谢.
如果数组[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)")
}
}
Run Code Online (Sandbox Code Playgroud)
如果事实证明一个或多个不是正确的类型,那么这用来[]替换nil你得到的空数组AnyObject- if…else如果你想要显式错误处理而不是静默失败,你仍然需要一个空数组.
或者,如果您希望程序在发生故障时陷阱,您可以使用,as!但如果您在生产中发现这一点,那将是一种耻辱.
顺便说一句,如果你必须为解开的值提出一个新名称的事实是困扰你的一部分,你可以给它相同的名字:
let x: Int? = 1
if let x = x {
println(x)
}
Run Code Online (Sandbox Code Playgroud)
该声明一个局部展开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)")
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
389 次 |
| 最近记录: |