Objective c 目标-C代码(array.indexOfObjectPassingTest)到Swift

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

我如何在Swift中使用下面的Objective-C代码,我尝试过,但出现了一些问题

目标-C:

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