使用两个集合类型参数查找项目索引

时间:2017-08-14 22:51:15

标签: swift

我已经检查了这个SO answer以找到弃用的find方法的解决方案,但解决方案是单个数组。在我的项目中,我有两个参数,它们都是集合类型。通过重构,我收到了熟悉的条件绑定错误。

我尝试删除条件绑定并使用index(of: ),就像我引用的SO答案一样,但由于我不使用像String类型这样的单个元素,我自然会得到元组错误。

如果无法在元组上调用方法,为什么原始find方法能够在下面的Swift 2行中调用元组?

class MoneyPickerTableViewController: UITableViewController {   

var money: [String: String]
var purchaseOrder: [String]
var chosenKey: String = USDPreferences.shared().object(forKey: kUSDChosenMoneyKey) as! String    

// Swift 2
if let index = find(purchaseOrder, chosenKey) {
let indexPath = NSIndexPath(forRow: index, inSection: 0)

tableView.selectRowAtIndexPath(indexPath, animated: animated, scrollPosition: .Middle)
}    

navigationController?.setNavigationBarHidden(false, animated: animated)
}

Swift 3

let collections = (purchaseOrder, chosenKey) as ([String], String) 
let index = collections.index(of: )

2 个答案:

答案 0 :(得分:1)

您的Swift3次尝试与您的Swift2代码无关。 在Swift2代码中,find(purchaseOrder, chosenKey)返回字符串数组chosenKey中String变量的索引purchaseOrderSwift3。在你的chosenKey代码中,你正在尝试从你的字符串数组和搜索字符串中创建一个元组,并在元组中查找元素,这将永远无法工作,因为你试图用非元素搜索元组元组值。

实际上代码应该很简单:您只需要使用purchaseOrder函数在index(of:)中找到row的索引,并将其用作guard let row = purchaseOrder.index(of: chosenKey) else { return } let indexPath = IndexPath(row: row, section: 0) tableView.selectRow(at: indexPath, animated: animated, scrollPosition: .middle) 索引

@task
def step_one(items):
    items.sort()
    for i in range(len(items), 100):
        yield items[i:i + 100]

@task
def step_two(batch):
    for item in batch:
        print(item)

if __name__ == '__main__':
    celery.chain(step_one.s([i for i in range 100000]), step_two.map().s()).delay()

答案 1 :(得分:0)

find(_:_:)曾经是一个自由函数,它将Collection作为第一个参数,将所需元素作为第二个参数。

自Swift 2以来,此功能现在作为Collection上的实例方法实现,称为index(of:)

以前的find(purchaseOrder, chosenKey)现在拼写为purchaseOrder.index(of: chosenKey)