Objective c 目标-C代码(array.indexOfObjectPassingTest)到Swift
我如何在Swift中使用下面的Objective-C代码,我尝试过,但出现了一些问题 目标-C:Objective c 目标-C代码(array.indexOfObjectPassingTest)到Swift,objective-c,xcode,swift,cocoa,nsarray,Objective C,Xcode,Swift,Cocoa,Nsarray,我如何在Swift中使用下面的Objective-C代码,我尝试过,但出现了一些问题 目标-C: NSUInteger index = [theArray indexOfObjectPassingTest: ^BOOL(NSDictionary *dict, NSUInteger idx, BOOL *stop) { return [[dict objectForKey:@"name"] isEqual:theVal
NSUInteger index = [theArray indexOfObjectPassingTest:
^BOOL(NSDictionary *dict, NSUInteger idx, BOOL *stop)
{
return [[dict objectForKey:@"name"] isEqual:theValue];
}
];
let index = theArray.indexOfObjectPassingTest { (var dict: NSDictionary, var ind: Int, var bool: Bool) -> Bool in
return dict.objectForKey("name")?.isEqual("theValue")
}
Swift(不起作用):
NSUInteger index = [theArray indexOfObjectPassingTest:
^BOOL(NSDictionary *dict, NSUInteger idx, BOOL *stop)
{
return [[dict objectForKey:@"name"] isEqual:theValue];
}
];
let index = theArray.indexOfObjectPassingTest { (var dict: NSDictionary, var ind: Int, var bool: Bool) -> Bool in
return dict.objectForKey("name")?.isEqual("theValue")
}
我猜你需要这个:
var index: UInt = theArray.indexOfObjectPassingTest({(dict: [NSObject: AnyObject], idx: UInt, stop: Bool) -> BOOL in return dict.objectForKey("name").isEqual(theValue)
})
我玩了它,让它发挥作用:
let theArray: NSArray = [["name": "theName"], ["name": "theStreet"], ["name": "theValue"]]
let index = theArray.indexOfObjectPassingTest { (dict, ind, bool) in return dict["name"] as? String == "theValue" }
if index == NSNotFound {
print("not found")
} else {
print(index) // prints "2"
}
这可以进一步减少。正如注释中提到的@newacct,可以删除
返回值
,因为闭包只是一行。此外,\uu
可以用来代替未使用的参数:
let index = theArray.indexOfObjectPassingTest { (dict, _, _) in dict["name"] as? String == "theValue" }
您可以完全删除闭包中的参数列表,并使用默认的$0
值。注意,在这种情况下,三个参数组合为一个元组,因此元组dict
的第一个值被引用为$0.0
:
let index = theArray.indexOfObjectPassingTest { $0.0["name"] as? String == "theValue" }
Swift 3:
考虑这种方法:
public func index(其中谓词:(元素)抛出->Bool)返回->Int?
下面给出了一个如何使用它的示例:
let dict1 = ["name": "Foo"]
let dict2 = ["name": "Doh"]
let array = [dict1, dict2]
let index = array.index { (dictionary) -> Bool in
return dictionary["name"] == "Doh"
}
这将返回值1
希望能有所帮助我最终将此用于Swift5项目:
let index = self.info.indexOfObject(passingTest: { (obj:Any, ind:Int, stop:UnsafeMutablePointer<ObjCBool>) -> Bool in
if let details = obj as? NSDictionary, let id = details["id"] as? Int
{
if (orderId == id)
{
stop.pointee = true
return true
}
}
return false;
})
let index=self.info.indexOfObject(passingTest:{(obj:Any,ind:Int,stop:UnsafeMutablePointer)->Bool-in
如果let details=obj as?NSDictionary,则let id=details[“id”]as?Int
{
if(orderId==id)
{
stop.pointee=true
返回真值
}
}
返回false;
})
其中orderId是我要查找的对象的id值。它不起作用。。“无法使用类型为…”的参数列表调用'indexOf…'”向上投票发生了什么?我看到它从0到1到0到1到0?不客气。看到它来回切换很奇怪。如果只有一行,就不需要
return