- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
对于数组:我如何做 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>
和 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 数组上。不过,这有点让人头疼,因为必须为您希望能够使用的每个类(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/
我有一个关于 xcode 编码的简单问题,但不知道为什么事情没有像我想象的那样执行。我有一个对象数组(自定义对象)。我只是想检查一下这个是否在数组中。我使用了以下代码: NSArray *collec
我有一个 UITabelView 显示项目列表(从服务器返回),用户将能够选择任何项目并将其添加到他自己的部分。选择一个项目后,我将检索所选项目的详细信息并将其保存到 pList 文件中,然后该列表将
我有一个名为 selectedUsers 的 NSMutableArray,我正在使用名为 addUser 的方法向其添加对象。被添加的对象通常是 PLManagedUser 类型(一个核心数据管理对
我有这样的字符串数组:数组 = P123、P234、P543、P678 我有像 P12300 这样的字符串。(这可以是数组中的相同字符串,也可以没有尾随零)。 我正在使用 containsObject
我目前正在使用这个扩展: extension Array { func containsObject(_ object:Any) -> Bool { if let an
我正在开发一个应用程序来检查数组以查看它是否包含特定字符串。但是,它似乎工作不正常,因为我认为它可能正在查看字符串的大小写。在这行代码中,我如何确保 containsObject: 不区分大小写? i
我对NSArray containsObject方法有些困惑。此方法是否比较指向对象的指针或对象的确切内容?更具体地说:我有一个NSIndexPath对象数组,在之前的某个地方创建,现在我要检查是否存
我正在调用 DetailsViewController 尝试使用以下代码,如果, ([[FavViewController myFavsTwo] containsObject:_word]) 但出现错
我有一个包含以下内容的数组列表 (RatingsList) {type = mutable-small, count = 8, values = ( 0 : {contents = "NR-A
所以,Apple 的文档是这样描述containsObject的: This method determines whether anObject is present in the array by
对于数组:我如何做 indexOfObject 或适当的 containsObject? 我的意思是我知道我可以将 Array 桥接到 NSArray 并在那里完成 ^^ 但是必须有一种“本地”方式来
我需要确定一个对象是否包含在 Core Data 对多关系(这是一个 NSSet)中,并且我正在尝试确定两种解决方案中哪一种更好: 解决方案 1) if ([managedObject.items c
这两个属于NSSet类的方法有什么区别: -(BOOL)containsObject:(id)anObject -(id)member:(id)object 最佳答案 答案在于返回值。 contain
我发现了类似的问题,但是 -containsObject 没有像我预期的那样工作。 我的问题是 NSMutableArray -containsObject 方法不应该返回 true,当尝试生成随机的
closed = [[NSHashTable alloc]initWithOptions:NSPointerFunctionsObjectPointerPersonality capacity:400
NSSet 添加了两个对象,但是当我检查成员资格时,我找不到其中之一。 下面的测试代码在 iOS7 中运行良好,但在 iOS8 中失败。 SKNode *changingNode = [SKNode
假设我有一个 NSSet,里面有一个字符串。如果我将 containsObject: 与另一个字符串一起发送,该字符串是不同的指针但字符串值完全相同,是否会返回 YES? 另外,removeObjec
上周我一直在使用最新的 Facebook iOS SDK v4.0.1 编写 Swift 应用程序。今天更新到最新的XCode 6.3 和Swift 1.2 后,出现了很多错误。我已经能够修复其中的大
我是一名优秀的程序员,十分优秀!