swift 1.2 - 递归数据结构的文字表示

时间:2015-07-26 05:11:01

标签: xcode swift recursion

作为我学习Xcode / Swift的努力的一部分,我正在构建一个应用程序来跟踪Stuff。

我是层级结构的忠实粉丝。我的数据方案有一个名为“Item”的类,它跟踪名称,描述等。 Item有一个名为“Container”的子类,它添加一个字段以包含其他Items和Containers。这是一个核心数据项目,但这与此问题无关。

我应该注意到,我正在采用以测试为导向的自下而上的方法。现在我正在研究用于记录和获取数据的基本数据结构和方法,以便以后保存UI。

我遇到的问题与数据结构的递归性质有关。一切顺利,直到我将递归引入我的测试数据。

这是我的测试数据块的数据描述,它对Items和空容器成功。

[(cType: String, content: [String: AnyObject?] )]

它是一个元组数组,每个元组代表一个Item / Container记录。 cType是一个字符串,用于表示content中的字典是表示项目还是容器。 (我知道cType应该是某种枚举,但这不是问题。)

在内容字典中,值都是字符串,但有一个例外:Container s有一个名为contained_items的字段,其值由上述相同的结构表示...另一个{ {1}}元组。

我在其他地方已经了解到,支持递归的唯一结构是一个类。我通过创建这样一个课程来接近成功,但我仍然无法从字面上表达它。

请考虑以下事项:

(cType,content)

在顶层,该块有三个元素。前两个加载成功,但带有contains_item的Container会生成语法错误(无法将类型'[(cType:String,content:[String:AnyObject?])]'的返回表达式转换为预期的返回类型'[(cType:字符串,内容:[String:AnyObject?])]')

所以我的问题是:

1:有没有办法定义这样的结构?不仅要有一个可能包含自身的类,还要以上面尝试过的方式表示?

2:对于字典项的值,是否有比 func loadDataSet() -> [(cType: String, content: [String: AnyObject?] )] { return [ (cType: "Container", content: ["name":"Attic of the gods","item_description":"The innavigable realm of random stuff"]) // empty Container ,(cType: "Item", content: ["name":"Thing","item_description":"I am a weird thing"]) // next, a Container with contained items ,(cType: "Container", content: ["name":"Cardboard box","item_description":"I am a box full of stuff","contained_item": [ (cType: "Item", content: ["name":"Doo-dad","item_description":"I am a doo-dad of some sort"]) ] ]) ] } 更好的数据类型?我想缩小范围,并(以某种方式)说它可以是AnyObject?String。文档表明,我可以用枚举做一些魔法,但我还没有把我的大脑包裹起来。

3:我现在正在使用Swift 1.2,我知道Swift 2支持递归枚举。 Swift 2的新功能是否足够引人注目,或者我应该等到它没有测试版? (这个项目不太可能在新版本的Xcode和Swift之前发布。)

感谢所有阅读此内容的人,并提前感谢所有人的帮助。

1 个答案:

答案 0 :(得分:0)

实际上,所有这三个元素都会产生语法错误,而且不是递归问题。问题是swift String和swift Dictionary是结构体,而不是类。

结构不能转换为AnyObject?,但可以转换为Any?

如果您将func声明更改为

func loadDataSet() -> [(cType: String, content: [String: Any?] )] 

您的示例代码将成功编译。