对于数组:我该怎么做indexOfObject或正确的containsObject?
我的意思是我知道我可以将数组桥接到NSArray那里并在那里做^^
但是必须有一种"原生"方式来做到这一点
PS containsObject我想我可以过滤数组但是对于indexOf?
mat*_*att 44
您可以使用内置函数find,从而避免桥接到Objective-C - 但前提是您的元素类型是Equatable.(如果它不是Equatable,你可以使用比较函数和扩展来实现它.)
例:
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
}
}
Run Code Online (Sandbox Code Playgroud)
现在,您可以拨打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
}
Run Code Online (Sandbox Code Playgroud)
并像这样测试:
var arr = [Piece(1), Piece(2), Piece(3)]
removeObject(&arr,Piece(2))
println(arr)
Run Code Online (Sandbox Code Playgroud)
您也可以为NSObject子类执行此操作.例:
func == (v1:UIView, v2:UIView) -> Bool {
return v1.isEqual(v2)
}
extension UIView : Equatable {}
Run Code Online (Sandbox Code Playgroud)
现在你可以调用find一个UIView数组.但是,对于你希望能够find在该类的数组上使用的每个类都必须这样做,这对于屁股来说是一种痛苦.我已经向Apple提交了一个增强请求,要求将所有NSObject子类视为Equatable,并且==应该isEqual: 自动返回.
编辑从种子3开始,这对于UIView和其他NSObject类是自动的.所以find现在只适合他们.
编辑2从Swift 2.0开始,indexOf将作为一种方法存在:
let s = ["Manny", "Moe", "Jack"]
let ix = s.indexOf("Moe") // 1
Run Code Online (Sandbox Code Playgroud)
或者,它需要一个返回Bool的函数:
let ix2 = s.indexOf {$0.hasPrefix("J")} // 2
Run Code Online (Sandbox Code Playgroud)
同样,这只适用于Equatable的集合,因为很明显你不能在大海捞针中找到一根针,除非你有一种识别针的方法.
编辑3 Swift 2.0还引入了协议扩展.这意味着我可以将我的全局函数重写removeObject为一种方法!
例如:
extension RangeReplaceableCollectionType where Generator.Element : Equatable {
mutating func removeObject(object:Self.Generator.Element) {
if let found = self.indexOf(object) {
self.removeAtIndex(found)
}
}
}
Run Code Online (Sandbox Code Playgroud)
由于Array采用RangeReplaceableCollectionType,现在我可以编写如下代码:
var arr = [Piece(1), Piece(2), Piece(3)]
arr.removeObject(Piece(2))
Run Code Online (Sandbox Code Playgroud)
哦,快乐的一天!
| 归档时间: |
|
| 查看次数: |
20751 次 |
| 最近记录: |