Swift 快速L系统藻类

Swift 快速L系统藻类,swift,l-systems,Swift,L Systems,所以这只是我在IBMSwift沙盒中为了好玩而做的事情。我最近在Scala上做了一个L-系统,虽然在Swift上做这个会很酷,看看语言之间的对比 这是Scala one,向你展示了我的目标,这就是我在Swift中所拥有的 /** * Created by t.hood on 26/01/16 * L-System Algae * */ import Foundation // Mapping function for string func stringmap(x:

所以这只是我在IBMSwift沙盒中为了好玩而做的事情。我最近在Scala上做了一个L-系统,虽然在Swift上做这个会很酷,看看语言之间的对比

这是Scala one,向你展示了我的目标,这就是我在Swift中所拥有的

/**
  * Created by t.hood on 26/01/16
  * L-System Algae
  *
  */

 import Foundation

 // Mapping function for string

 func stringmap(x: String) -> String {
 var str = x;

     // Replace characters in string
     str = x.stringByReplacingOccurrencesOfString("A", withString: "AB") +
     str.stringByReplacingOccurrencesOfString("B", withString: "A");

  // Return mapped string;
  return str;
 }

 func lsys() {

 // Declarations

 var iteration : Int = 2;
 var x = 0;
 var lsystem: String = "A";
 let charA: Character = "A";
 let charB: Character = "B";

 while(x != iteration) {

 print(lsystem)

  // Iterate through characters in string
  for chars in lsystem.characters {
    lsystem = stringmap(lsystem);
  }

  // Inc count ..
  x+=1

 }
}

 // Run ..
 lsys();
我遇到的问题是我的映射函数。我需要它映射x,打印结果,然后在str上执行下一个映射。问题是我在两个映射之间都有运算符+,第一次操作后我无法让swift打印str


有没有人知道如何避开这个问题?如果我能在第一次替换后打印str,我想它会工作。

我在Xcode中创建了一个项目,这样我就可以使用调试器查看发生了什么。这是我发现的

我将您的print语句移动到for循环中,这样每次执行循环时它都会显示lsystem的值

当x==0和1时,while循环执行两次 第一次通过while循环lsystem='A',因此for循环执行一次。在stringmap()中,“A”变为“ABA”。 “ABA”是印刷品。 第二次通过while循环时,for循环执行三次。 对于循环1,将“ABA”发送到stringmap(),并返回“abbaaa”。 对于循环2,将“abbabaa”发送到stringmap(),并返回“abbababaaaaa”。 对于循环3,将“abbbabababaaaaaa”发送到stringmap(),并返回“abbbababababababababababaaaaaaaaaaaa”

我修改了stringmap()函数,逐个字符遍历字符串,并将语法应用于每个字符,将每个更改附加到一个新字符串,然后返回到lsys()

while循环的七次迭代返回了这个结果,这与我在维基百科关于L系统的文章中看到的结果一致。 迭代0:A 迭代1:AB 迭代2:ABA 迭代3:ABAAB 迭代4:阿巴巴 迭代5:ababab 迭代6:阿巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴巴 迭代7:abababababababababababababababababababab

这是密码。这在我的iMac上的操场上起作用,我希望它也能在IBMSwift沙箱中起作用

func stringmap(x: String) -> String
{
    var returnString = ""

    for char in x.characters
    {
        switch (char)
        {
        case "A" :
            returnString += "AB"
            break
        case "B":
            returnString += "A"
            break
        default:
            break
        }
    }
    return returnString
}


func lsys()
{

    // Declarations

    let iteration : Int = 7;
    var x = 0;
    var lsystem: String = "A";

    print("Iteration \(x): \(lsystem)")

    while(x != iteration)
    {
        lsystem = stringmap(lsystem)
        x++
        print("Iteration \(x): \(lsystem)")

    }
}

lsys()

我不确定基本上使用“+”操作符是否会一个接一个地运行这些操作。我需要将A计算为只有A。但是,如果第一个函数运行,那么它可以作为AB结束,然后第二个函数将运行,并且它将作为ABA结束。当您执行
str=x
时,这是复制还是仅仅引用同一个字符串?它应该复制我相信我想我需要的是StringByReplaceOfString函数接受两个参数,比如SBROS(“a”,“B,带字符串:“AB”,带字符串:“a”);