Swift:recursion值types

我有一个结构,我想有一个全局variables的types结构? 这个例子实际上是我实际上创build的结构的简要版本。

struct SplitString { //splits a string into parts before and after the first "/" var preSlash: String = String() var postSlash: SplitString? = nil init(_ str: String) { var arr = Array(str) var x = 0 for ; x < arr.count && arr[x] != "/"; x++ { preSlash.append(arr[x]) } if x + 1 < arr.count { //if there is a slash var postSlashStr = String() for x++; x < arr.count; x++ { postSlashStr.append(arr[x]) } postSlash = SplitString(postSlashStr) } } } 

但是,它会抛出错误:

 Recursive value type 'SplitString' is not allowed 

有什么办法可以解决这个问题吗? 任何帮助将是伟大的。 谢谢 :)

编辑:如果它是相关的,我在iOS上编程,而不是OSX。

编辑:如果我有:

 var split = SplitString("first/second/third") 

我希望分裂是:

 {preSlash = "first", postSlash = {preSlash = "second", postSlash = {preSlash = "third", postSlash = nil}}} 

TL; DR:

你正在努力实现的是很容易实现使用拆分:

 for s in split("first/second/third", { c in c == "/" } ) { println("\(s)") } 

讨论:

看来你正在试图写一个值types的链表。 问题是Swift将复制语义的概念与值/引用访问结合起来。 (不像说C ++,它允许你在堆栈或堆上创build相同的对象)。 解决scheme似乎将它包装在一个参考容器又名类。

 class SplitString { //splits a string into parts before and after the first "/" var preSlash: String = String() var postSlash: Wrapped? = nil init(_ str: String) { var arr = Array(str) var x = 0 for ; x < arr.count && arr[x] != "/"; x++ { preSlash.append(arr[x]) } if x + 1 < arr.count { //if there is a slash var postSlashStr = String() for x++; x < arr.count; x++ { postSlashStr.append(arr[x]) } postSlash = Wrapped(postSlashStr) } } } class Wrapped { var split:SplitString init(var _ str:String) { split = SplitString(str) } } 

请注意,这段代码是作为一个概念certificate来编译的,但是我还没有研究过你的algorithm或者testing过它。

编辑:

为了回应上面的编辑,这段代码将会执行上面的代码,并产生你想要的分割:

 for (var s:SplitString? = split; s != nil; s = s?.postSlash?.split) { println("\(s!.preSlash)") } 

显然,通过上面的讨论,让海龟一路下来是没有意义的,所以你需要打破这个循环,就像包含你的结构的类一样。

请注意,我一直在试着回答你发布的问题,而不是你有的问题。 解决问题的方法是使用SequenceOf和GeneratorOf来创build一个顺序包装的生成器,它通过斜杠进行迭代并返回之间的子串。 这实际上是通过分割function为你完成的:

 for s in split("first/second/third", { c in c == "/" } ) { println("\(s)") } 

我想这是因为一个可选行为像一个值types。 所以你有什么值types的值types。 值types。

为了做一个值types的布局,你需要知道事物的大小。

所以你有(简化):

 sizeof(SplitString) = sizeof(String) + sizeof(SplitString?) 

 sizeof(SplitString?) > sizeof(SplitString) 

因为你需要存储这个值是否存在的事实(和,不,一个sizeof(SplitString)零的模式不是一个有效的表示,因为它将是一个类的types – 为什么?想像Int?= 0)

所以,现在你有

 sizeof(SplitString?) > sizeof(String) + sizeof(SplitString?) 

但涉及的所有数量肯定是> 0.而是荒谬的,对吗?

Interesting Posts