带有 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
跟进此处 () 关于 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