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

标签 ios swift dictionary instance

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

我将 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 方法之前运行。确保 filteredObjectsobjects 是相同的结构。即 [[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/

相关文章:

java - 使用 JUniversal 翻译 Android 项目

ios - 使用 Parse 检索与您在同一个公会中的所有公会成员

ios - 仅更改 UITableView 的主体颜色或仅更改状态栏颜色

swift - 自定义 TableViewCell 出了问题?

java - 根据键属性转换给定 SortedMap 的排序顺序

ios - 希望单元格中的标签有 2 行。如何附加第二行?

ios - 在 plist 字典中查找字符串

ios - RxSwift MVVM 在按钮上验证表单提交然后发出 API 请求

java - 在 map 中搜索耗时过长的广度优先搜索策略

python - 以表格格式打印嵌套字典键和值