实例成员不能用于类型 - Swift错误

时间:2016-08-02 19:33:41

标签: ios swift dictionary instance

到目前为止,让我解释一下我的应用程序......

我将口袋妖怪数据存储在名为objects的字典中。

第一个VC - >用户选择一个口袋妖怪角色,所选的口袋妖怪的细节被添加到另一个词典。

用户然后按下一个按钮,将它们带到第二个VC(collectionViewController) - >他们选择的口袋妖怪数据也会被传递并存储到名为selectedPokemonObject

的变量中

如果我print(selectedPokemonObject)我可以看到用户选择的数据,那么我知道数据正在传递给第二个VC。

collectionViewController中,我想展示与用户选择的口袋妖怪具有相同"type"的口袋妖怪。

我创建了一个过滤此变量的变量:

var filteredObjects = objects.filter{ ($0["type"] == selectedPokemonObject["type"])}

此代码不起作用 - 它给出了错误:

Instance member 'selectedPokemonObject' cannot be used on type '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的文件中,因此我可以在任何地方访问它。

1 个答案:

答案 0 :(得分:1)

有些事情我不同意您的代码,但我会首先帮助您修复错误。 Swift不喜欢你使用实例化变量来帮助你实例化另一个变量。 Swift无法知道哪一个将首先被初始化。而是将它们初始化为空,并在viewDidLoad()中设置它们的值,这将在UITableViewDataSource/Delegate方法之前运行。确定filteredObjectsobjects是相同的结构。 I. E. [[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与pokemom的类型2匹配,它将进入过滤等等。