【问题标题】:SequenceType with DictionaryGenerator - issues with Struct when Class works fine?带有 DictionaryGenerator 的 SequenceType - 当 Class 工作正常时 Struct 出现问题?
【发布时间】:2016-01-14 17:56:17
【问题描述】:

在此处 (https://stackoverflow.com/a/25322949/5583125) 跟进有关 SequenceTypes 和字典的出色回复。

我正在使用:Xcode 7.2 和 Swift 2.1

更新:澄清一下,我在 Playground 中运行它

当嵌入字典中的子项是一个类时,这很有效,但我在使用 Struct 时遇到了问题 - 我不明白为什么会这样。

效果很好:

 class Item {
  let title: String
   init(_ title: String) {
     self.title = title
  }
}

 class ItemList : SequenceType {

  private var itemDict: [String : Item] = [ : ];

  subscript(key : String?) -> Item? {
     get {
       if key != nil {
         return self.itemDict[key!];
      }
       return nil;
    }
     set(newValue) {
       if key != nil {
         self.itemDict[key!] = newValue;
      }
    }
  }

  func generate() -> DictionaryGenerator<String, Item> {
     return itemDict.generate()
  }
}

 var list = ItemList()
 list["key1"] = Item("value1")
 list["key2"] = Item("value2")

 for (key, value) in list {
   print("Key: \(key) Foo: \(value.title)")
}

炸毁:

当我将 Item 更改为 Struct 时,for-each 会爆炸,我会收到“EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)”异常。

 struct Item {
  let title: String
   init(_ title: String) {
     self.title = title
  }
}

//Not so happy when Item is a struct
 for (key, value) in list {
   print("Key: \(key) Foo: \(value.title)")
}

有人能告诉我为什么会这样吗?我得到了 Matt Gibson 的回复中描述的基本概念 - 但我不明白为什么让 Item 成为结构而不是 Class 会破坏事情。

【问题讨论】:

  • 你在编译项目中试过了吗?
  • class ItemList : SequenceType 这是否会导致编译器错误,因为SequenceType 有`Self1 要求?
  • @Cristik:问题(据我所知)是将class Item 更改为struct,而不是class ItemList。但我无法重现该问题(也无法重现)。
  • 谢谢大家的帮助。下面的评论 - 原来这是一个游乐场?

标签: ios swift generator sequence


【解决方案1】:

也许问题在于您的测试方式有些奇怪?我在一个实际的 iOS 应用程序中尝试了你的代码,它运行良好。这是我测试中的完整类ViewController类文件:

import UIKit

struct Item {
    let title: String
    init(_ title: String) {
        self.title = title
    }
}

class ItemList : SequenceType {

    private var itemDict: [String : Item] = [ : ];

    subscript(key : String?) -> Item? {
        get {
            if key != nil {
                return self.itemDict[key!];
            }
            return nil;
        }
        set(newValue) {
            if key != nil {
                self.itemDict[key!] = newValue;
            }
        }
    }

    func generate() -> DictionaryGenerator<String, Item> {
        return itemDict.generate()
    }
}


class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let list = ItemList()
        list["key1"] = Item("value1")
        list["key2"] = Item("value2")

        for (key, value) in list {
            print("Key: \(key) Foo: \(value.title)")
        }


    }

}

运行良好,并输出:

Key: key1 Foo: value1
Key: key2 Foo: value2

【讨论】:

  • 对不起 - 我应该澄清一下。我在操场上尝试这个。我同意我觉得它应该有效。但是......现在在我的盒子上它正在抛出异常。
  • @eww 但是游乐场是一个高度人工的世界,并不能真正代表 Swift 的工作方式。 令人失望,这段代码可能有问题,但没有任何问题显着
  • 是的,我不得不承认,鉴于示例相对简单,我对此感到非常惊讶。我拿了样本并将其放入一个实际的项目中——效果很好。有点令人沮丧,因为游乐场是一个很好的方式来尝试一些事情,而无需建立一个专门的项目。吸取教训,我猜。感谢您的帮助。
  • 好主意。今天下午我会这样做。
  • 提交到错误报告
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-03
  • 1970-01-01
相关资源
最近更新 更多