我已经检查了这个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: )
答案 0 :(得分:1)
您的Swift3
次尝试与您的Swift2
代码无关。
在Swift2
代码中,find(purchaseOrder, chosenKey)
返回字符串数组chosenKey
中String变量的索引purchaseOrder
。Swift3
。在你的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)