对于数组:我该怎么做indexOfObject
或正确的containsObject
?
我的意思是我知道我可以将Array桥接到NSArray
那里并在那里做^^
但是必须有一种“本机”的方式来做到这一点
PS的containsObject
我想我也可以过滤数组,但 indexOf 吗?
您可以使用内置的find
,从而避免桥接到Objective-C
-但前提是您的元素类型为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)
where arr
是Array<Piece>
and 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:
自动 恢复。
编辑 从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系列,因为很明显您无法在大海捞针中找到针头,除非您有找到针头的方法。
编辑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)
}
}
}
由于Array采用RangeReplaceableCollectionType,因此现在我可以编写如下代码:
var arr = [Piece(1), Piece(2), Piece(3)]
arr.removeObject(Piece(2))
哦,快乐的一天!
问题内容: 我有一个树结构,其中每个都有一个父级和一个。每个节点都有一个,我想在其中选择进行查询,即该节点和所有父节点的标题。如何编写此查询? 单个标题的查询就是这样,但是就像我说的那样,我希望它扩展到整个父母分支。 干杯 尼克 问题答案: 您不能使用HQL进行递归查询。看到这个。如前所述,它甚至不是标准的SQL。您有两种选择: 编写特定于供应商的递归本机SQL查询 进行多个查询。例如: 我肯定会
我想使它从“游戏26”类到“游戏39”类,如果用户经历了从“游戏17”类到“游戏18”类。但如果用户没有通过,要使从“Game26”类到“Game30”类。
我正在编写if-else语句,如果满足某个条件,我希望程序什么也不做。下面的代码显示了我的意思。 如果number等于零,我希望程序保留这个If-else语句,并移动到下一段代码,这段代码在while循环中
前端面试,该怎么做自我介绍,理想哥面试过的前端开发超过1200人了,发现大部分前端都不会做自我介绍,点赞收藏支持一下,给我一分钟,我用这套自我介绍模版,面试过阿里、腾讯、字节、美团这样的大厂,都很顺利,今天分享给大家: 首先我们先来看错误的案例: 案例1:「面试官你好,我是谁谁谁,今天来面试前端开发岗位,我有一个女朋友,也在xx这个城市」,然后巴啦啦说了一大堆。 不知道面试者是紧张还是啥原因,真不
想要做一个能够自适应的卡片布局,该怎么做? 就是能够根据里面方块的数量,去填满整个大方块,小方块的数量不确定。
我在互联网上搜索,当机器人被踢出一个语音频道时,我该怎么办?用“断开”按钮发送一条消息,如“机器人断开了语音频道的连接”,但我不知道如何在不一致的情况下获取这些信息。js我用播放列表编写了一个音乐机器人,但当我踢开vc的机器人时,我就做了!播放命令,它将音乐添加到队列中,而不加入频道。当机器人被踢开时,我想用“queue.delete(guild.id)”清除音乐队列。