2016-08-02 78 views
0

让我解释一下我的应用程序,到目前为止...实例成员不能在类型一起使用 - 斯威夫特错误

我存储在口袋妖怪数据和字典称为objects的阵列。

1st 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 

} 
} 

UPDATE

objects数据被存储在一个名为Data.swift,所以我可以在任何地方访问它文件的全局变量。

+0

几个问题。 “对象”在哪里申报?它是一个全局变量吗?另外,他们设置你的过滤器语句的方式是使得它只有pokemon和''typeTwo''字段的EMPTY字符串,但是如果它们有一个零或任何其他字符串,它将被过滤掉。 – NSGangster

+0

@NSGangster我将更新添加到我的问题中,并修改了'typeTwo'错误(我之前正在玩弄它) - 谢谢 – Nick89

+0

您是否尝试在过滤之前保存electionPokemonObject [“type”]以检查是否会工作?并分开这两个过滤器一步一步走? –

回答

1

有几件事我不同意你的代码,但我会从帮助你解决你的错误开始。 Swift不喜欢使用实例化变量来帮助实例化另一个变量。 Swift无法知道哪一个会先被初始化。相反,将它们初始化为空,然后在viewDidLoad()中设置它们的值,这些值将在您的方法之前运行。确认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或类型2匹配,它们将在我们的过滤器列表中。或者,你可以尝试添加语句,如果所选口袋妖怪的类型1匹配类型2的pokemom,它将进入过滤等等。

+0

谢谢。我明白你的意思是围绕过滤。我已经做出了修改,但现在又抛出了另外两个错误。针对过滤器代码行,出现错误:'成员'过滤器'的模糊引用',然后在'cellForItemAtIndexPath'方法中,对着'let object = filteredObjects [indexPath.row]'行进一步向下,我得到错误:'不能用类型为'Int''的索引来下标类型为'[String:String]'的值。 – Nick89

+0

啊,对于你的dataSource方法,你需要一个数组来代替字典。我弄糟了你的数据结构。一秒钟,我修理了一些东西。 – NSGangster

+0

@ Nick89更新了一些代码。如果它仍然不起作用,请在代码中声明'objects'数组。 – NSGangster