7. swift & kotlin 的字符串常用操作

值类型

swift 的字符串是值类型,这点和 kotlin 是不一样的,kotlin 来自于 java,所以和java 一样,是对象类型。

swift 并不是每次赋值字符串都会发生拷贝,只有新的对象发生改变的时候才会发生值拷贝

可变与不可变

swift 的 String 类型可变与不可变取决于是否可以定义的字段

let str = "test" // 不可变
var str2 = "test" // 可变

感觉很完美的继承了 swift 定义的风格
kotlin 是 Jvm 语言,所以所有的字符串都是不可变的

val str1 = "test" // str1 指向的对象不可变
var str2 = "test" // str2 指向的对象可变

因此, Swift 的 字符串可以这样操作

var str = "test"
str.append("test")

kotlin 是没有这样方法的,只能生成一个新的字符串赋值给新的对象

var str = "test"
str = str + "test"

当然,kotlin 直接使用 StringBuilder 就能或者一致的体验了

var str = StringBuilder("test")
str.append("test")

总得来说,swift 这个地方定义要更高一筹

字符串插值

就是在字符串里面混合写变量的能力
swift 插值使用 \(value) 这种方式

let name = "gru"
print("I am \(name)")

kotlin 插值就是使用${value}这种方式,当只是一个变量的时候 ,{}可以去掉

let name = "gru"
print("I am $name")
print("I am ${name}") //两种写法都可
print("I am ${name.lenght}") // 如果是表达式就一定要写大括号

groovy 和 typescript 的插值有点不一样,他们因为多了一种定义字符串的方式,所以要特殊定义字符串的方式才能插值

groovy 需要双冒号定义的字符串才能插值

def name = "gru"
print("I am $name")
print("I am ${name}") //两种写法都可
print("I am ${name.lenght}") // 如果是表达式就一定要写大括号
print('I am ${name}') // 不支持

typescript 是需要 『``』 定义的字符串才支持插值

const name = "gru"
print(`I am $name`)

迭代字符

作为现代语言两个都是支持直接迭代出来字符的
swift

var str : String = "test"
str.forEach { (Character) in
    print(Character)
}

for cha in str {
    print(cha)
}

kotlin

var str2 = "test"
str2.forEach { 
    print(it)
}

for (char in str2){
    println(char)
}


但是 kotlin 可以直接访问某个位置的字符

println(str2[0])

swift 不支持的原因是,swift 支持的编码更多,没法用索引来界定每个完整字符

小结

两种语言在定义使用语言上都非常大的相似之处,但是 swift 在定义可变与不可变上更高一筹,同时支持的字符集也更多