2017-08-14 88 views
0

我已檢查此SO answer以查找已棄用的find方法的解決方案,但該解決方案適用於單個陣列。在我的項目中,我有兩個都是集合類型的參數。通過重構,我收到了我們熟悉的條件綁定錯誤。使用兩個集合類型參數查找項目索引

我已經嘗試刪除條件綁定,並使用index(of:)作爲在我引用的答案,但因爲我沒有像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) 
} 

夫特3

let collections = (purchaseOrder, chosenKey) as ([String], String) 
let index = collections.index(of:) 
曾經是,把一個集合作爲第一個參數的自由功能
+0

您不能調用元組的方法,只是期望該方法應用於每個元組成員。這並不是Swift的工作方式 – Alexander

+0

謝謝。我意識到這一點。這就是爲什麼我說「自然我得到這些錯誤」。我正在尋找一種方法來索引這兩個集合。原始代碼使用'find(purchaseOrder,chosenKey)'進行索引。對於爲什麼不現在呢,find方法在元組之前沒有問題? – tymac

+0

這不是一個元組,它是一個包含兩個參數'purchaseOrder'和'chosenKey'的函數調用。 – Alexander

回答

0

find(_:_:),和作爲所述第二期望的元件。

從Swift 2開始,此功能現在作爲Collection的實例方法實現,稱爲index(of:)

曾經被認爲是find(purchaseOrder, chosenKey)現在拼寫purchaseOrder.index(of: chosenKey)

+0

'藏品'不是一個集合。它是一個包含'[String]'和'[String]'的元組......請參閱我的編輯 – Alexander

+0

'index = purchseOrder(of:chosenKey)'給了我一個'無法調用非函數類型的值'[String] ?'錯誤。很明顯,因爲'purchaseOrder'不是函數類型。 – tymac

+0

@tymac這是一個錯字,它應該是'purchaseOrder.index(of:chosenKey)'。固定 – Alexander

1

Swift3企圖無關,與你的Swift2代碼。 在Swift2代碼中,find(purchaseOrder, chosenKey)返回字符串變量chosenKey中的索引,該變量爲purchaseOrder。在你的Swift3代碼中,你試圖從你的字符串數組和字符串中找出一個元組,然後查找元組中的元素,因爲你試圖用一個非元組值來搜索一個元組。

在現實中的代碼應該是這樣的簡單:你只需要使用index(of:)功能找到chosenKey該指數purchaseOrder並用其作爲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) 
+0

請在這裏提醒禮儀傢伙。亞歷山大先給了我答案,但它需要一個我應該能夠發現的簡單編輯,而大衛的答案是完整的答案,包括獎金後衛。咕嘟咕嘟。 – tymac

+0

嗯,這是你的選擇,你接受的答案,選擇你感覺更幫你的那個。如果兩個答案都有幫助,你可以投反正:) –

+1

對不起大衛。我不得不把它交給亞歷克斯,因爲他已經完成了所有的基礎工作。顯然,我給了你一個贊成票,因爲我最終使用了警惕。我通常會給你正確的答案,因爲你給了它所有完整的代碼,但這種情況是不同的。 – tymac

相關問題