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

时间:2016-01-14 17:56:18

标签: ios swift generator sequence

在此处(https://stackoverflow.com/a/25322949/5583125)对序列类型和词典做出了很好的回应。

我正在使用: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成为一个结构而不是一个类会破坏事物。

1 个答案:

答案 0 :(得分:0)

也许这个问题对你的测试方式有些奇怪?我在一个实际的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