在此处(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成为一个结构而不是一个类会破坏事物。
答案 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