带有 DictionaryGenerator 的 SequenceType - 当 Class 工作正常时 Struct 出现问题?

SequenceType with DictionaryGenerator - issues with Struct when Class works fine?

跟进此处 () 关于 SequenceTypes 和字典的精彩回复。

我正在使用:Xcode 7.2 和 Swift 2.1

更新:澄清一下,我运行这是在游乐场

当嵌入式字典中的子项是 Class 时,这非常有用,但我在使用结构时遇到问题 - 我不明白为什么会这样。

效果很好:

 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 会破坏事情。

也许这个问题与您测试的方式有关?我在实际的 iOS 应用程序中尝试了您的代码,它运行良好。这是我测试中的 complete class ViewController class 文件:

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