作为我学习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之前发布。)
感谢所有阅读此内容的人,并提前感谢所有人的帮助。
答案 0 :(得分:0)
实际上,所有这三个元素都会产生语法错误,而且不是递归问题。问题是swift String和swift Dictionary是结构体,而不是类。
结构不能转换为AnyObject?
,但可以转换为Any?
。
如果您将func声明更改为
func loadDataSet() -> [(cType: String, content: [String: Any?] )]
您的示例代码将成功编译。