对于数组:我该怎么做indexOfObject或正确的containsObject?
indexOfObject
containsObject
我的意思是我知道我可以将Array桥接到NSArray那里并在那里做^^ 但是必须有一种“本机”的方式来做到这一点
NSArray
PS的containsObject我想我也可以过滤数组,但 indexOf 吗?
您可以使用内置的find,从而避免桥接到Objective-C -但前提是您的元素类型为Equatable。(如果它不是平等的,则可以通过比较功能和扩展名来实现。)
find
例:
func == (lhs:Piece,rhs:Piece) -> Bool { return lhs.val == rhs.val } class Piece:Equatable,Printable { var val : Int var description : String { return String(val) } init (_ v:Int) { val = v } }
现在,您可以调用find(arr,p)where arr是Array<Piece>and p是Piece。
find(arr,p)
arr
Array<Piece>
p
Piece
一旦有了这些,就可以基于它开发实用程序。例如,这是一个全局函数,用于从数组中删除对象而不桥接到Objective-C:
func removeObject<T:Equatable>(inout arr:Array<T>, object:T) -> T? { if let found = find(arr,object) { return arr.removeAtIndex(found) } return nil }
并像这样测试它:
var arr = [Piece(1), Piece(2), Piece(3)] removeObject(&arr,Piece(2)) println(arr)
您也可以为NSObject子类执行此操作。例:
func == (v1:UIView, v2:UIView) -> Bool { return v1.isEqual(v2) } extension UIView : Equatable {}
现在您可以调用find一个UIView数组。但是,对于每个想要find在该类的Array上使用的单个类都必须这样做,这有点麻烦。我已经向Apple提出了增强请求,要求将所有NSObject子类都视为Equatable,并且==应该isEqual: 自动 恢复。
==
isEqual:
编辑 从Seed 3开始,这对于UIView和其他NSObject类 是 自动的。因此,find现在为他们工作。
编辑2 从Swift 2.0开始,indexOf将作为一种方法存在:
indexOf
let s = ["Manny", "Moe", "Jack"] let ix = s.indexOf("Moe") // 1
另外,它需要一个返回Bool的函数:
let ix2 = s.indexOf {$0.hasPrefix("J")} // 2
同样,这仅适用于Equatable系列,因为很明显您无法在大海捞针中找到针头,除非您有找到针头的方法。
编辑3 Swift 2.0还引入了协议扩展。这意味着我可以将全局函数重写removeObject为方法!
removeObject
例如:
extension RangeReplaceableCollectionType where Generator.Element : Equatable { mutating func removeObject(object:Self.Generator.Element) { if let found = self.indexOf(object) { self.removeAtIndex(found) } } }
由于Array采用RangeReplaceableCollectionType,因此现在我可以编写如下代码:
var arr = [Piece(1), Piece(2), Piece(3)] arr.removeObject(Piece(2))
哦,快乐的一天!