gpt4 book ai didi

ios - 我该怎么做 indexOfObject 或适当的 containsObject

转载 作者:IT王子 更新时间:2023-10-29 05:11:49 28 4
gpt4 key购买 nike

对于数组:我如何做 indexOfObject 或适当的 containsObject

我的意思是我知道我可以将 Array 桥接到 NSArray 并在那里完成 ^^
但是必须有一种“本地”方式来做到这一点

附言对于 containsObject 我想我也可以过滤数组但是对于 indexOf?

最佳答案

您可以使用内置的 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
}
}

现在您可以调用find(arr,p)其中 arr是一个 Array<Piece>pPiece .

有了它之后,您就可以基于它开发实用程序。例如,这里有一个全局函数,用于在不桥接到 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 数组上。不过,这有点让人头疼,因为必须为您希望能够使用的每个类(class)执行此操作 find在该类的数组上。我已向 Apple 提交增强请求,要求将所有 NSObject 子类视为 Equatable 并且 ==应该回到 isEqual: 自动

编辑 从 Seed 3 开始,对于 UIView 和其他 NSObject 类,这是自动的。所以find现在只为他们工作。

编辑 2 从 Swift 2.0 开始,indexOf将作为方法存在:

let s = ["Manny", "Moe", "Jack"]
let ix = s.indexOf("Moe") // 1

或者,它接受一个返回 Bool 的函数:

let ix2 = s.indexOf {$0.hasPrefix("J")} // 2

同样,这仅适用于 Equatable 的集合,因为显然你无法大海捞针,除非你找到一根针时有办法识别它。

EDIT 3 Swift 2.0 还引入了协议(protocol)扩展。这意味着我可以重写我的全局函数 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))

哦,快乐的一天!

关于ios - 我该怎么做 indexOfObject 或适当的 containsObject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24010700/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com