到目前为止,让我解释一下我的应用...
我将 Pokemon 数据存储在名为 objects
的字典数组中。
第一个 VC -> 用户选择一个 Pokemon 角色,所选 Pokemon 的详细信息将添加到另一个 Dictionary。
然后用户按下一个按钮,将他们带到第二个 VC (collectionViewController
) -> 他们选择的 Pokemon 数据也被传递并存储到一个名为 selectedPokemonObject
的变量中
如果我 print(selectedPokemonObject)
我可以看到用户选择的预期数据,所以我知道数据正在传递到第二个 VC。
在 collectionViewController
中,我想向用户选择的 Pokemon 显示具有相同 “type”
的 Pokemon。
我创建了一个过滤这个的变量:
var filteredObjects = objects.filter{ ($0["type"] == selectedPokemonObject["type"])}
此代码不起作用 - 它给了我错误:
实例成员“selectedPokemonObject”不能用于类型“CollectionViewController”
我不明白为什么会这样。
我已经看到围绕这个问题发布的一些问题,但无法理解其中的任何一个 - 他们的回答并不能真正帮助我解决我的问题,所以我很感激任何帮助。如何在我的代码中使用它?
CollectionViewController
的完整代码如下:
class CollectionViewController: UICollectionViewController {
var selectedPokemonObject = [String:String]()
override func viewDidLoad() {
super.viewDidLoad()
title = "Pokémon"
print(selectedPokemonObject)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
override func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
return 1
}
// MARK: UICollectionViewDataSource
var filteredObjects = objects.filter{ ($0["type"] == selectedPokemonObject["type"])}.filter{ ($0["typeTwo"] == selectedPokemonObject["typeTwo"])}
override func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return filteredObjects.count
}
override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCellWithReuseIdentifier("cell", forIndexPath: indexPath) as! CollectionViewCell
let object = filteredObjects[indexPath.row]
cell.pokemonName.text = object["name"]!
cell.pokemonImage.image = UIImage(named: "\(object["id"]!)"+"\(object["name"]!)")
return cell
}
}
更新
objects
数据作为全局变量存储在名为 Data.swift
的文件中,因此我可以在任何地方访问它。
最佳答案
有些地方我不同意您的代码,但我会首先帮助您修复错误。 Swift 不喜欢你使用实例化变量来帮助你实例化另一个变量。 Swift 无法知道哪个会先被初始化。而是将两者都初始化为空,并在 viewDidLoad()
中设置它们的值,这将在您的 UITableViewDataSource/Delegate
方法之前运行。确保 filteredObjects
和 objects
是相同的结构。即 [[String : String]]
var selectedPokemonObject = [String:String]()
var filteredObjects = [[ String:String ]]()
所以你过滤的方式是错误的。您基本上是在说“我过滤掉所有的口袋妖怪,除了那些与我的口袋妖怪具有相同的第一种类型的口袋妖怪。然后我再次过滤掉它们,直到我只从那个具有相同的第二种类型的小口袋妖怪中得到口袋妖怪。”看到我对口袋妖怪了解一点,很少有相同类型的。这会给你一个有限的 Poke 领域。而是尝试这样的事情。
override func viewDidLoad() {
super.viewDidLoad()
filteredObjects = objects.filter { $0["type"] == selectedPokemon["type"] || $0["typeTwo"] == selectedPokemon["typeTwo] }
}
这个过滤是说如果类型一或类型二匹配,它们将在我们的过滤器列表中。或者,您可以尝试添加语句,如果所选口袋妖怪的类型 1 与口袋妖怪的类型 2 匹配,它将进入过滤等。
关于ios - 实例成员不能用于类型 - Swift 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38729039/