Swift入门(二)——字符与字符串
Swift字符定义Swift中的字符,与OC有些不同,每一个字符代表了一个可拓展的字母集,可拓展的字母集由若干个(大于等于一个)Unicode标量值表示,这些标量构成了一个可拓展的字母集,也就是一个人类可读的字符。 Unicode标量一个Unicode标量占据21个比特位,一般格式为“U+xxxx”,这个解释有点抽象,其实我们通常理解的一个字母,也可以用一个Unicode标量来表示,比如字母’a’可以表示为”U+0061”。 刚刚说到,一个字符由若干个Unicode标量表示,比如以下这个例子: let combine1 = "u{1112}"
let combine2 = "u{1112}u{1161}"
let combine3 = "u{1112}u{1161}u{11AB}"
println("combine1 = (combine1)") println("combine2 = (combine2)") println("combine3 = (combine3)")
输出结果是
可见,对于一个字符,并不一定是由一个Unicode标量构成的。比如“???”。 字符类型推导刚刚的例子中,我们定义了三个常量,combine0,,combine1,combine2,他们被推导为什么类型呢?答案是String类型而不是Character类型,个人猜测是Swfit的宽类型优先导致的。这里通过简单的代码验证一下: var combine0 = "u{1112}"
var combine1:Character = "u{1112}"
combine0 += "abc" //正确
combine1 += "abc" //编译错误:无法将String类型与Character类型变量拼接
字符拼接在初始化字符类型常量或变量时,Swift会自动把能够拼接的Unicode标量拼接成一个人类可读字符,如果不能拼接,将生成一个由多个字符所组成的字符串。把这个值赋给一个已经标注为Character类型的变量会导致编译错误。 var string = "u{1112}u{10FFFF}" //正确,string变量被推导为String类型
var c:Character = "u{1112}u{10FFFF}" //错误,无法赋值给Character类型变量
Swift字符串定义Swift中的字符串由若干个字符构成。 字符串初始化一共有两种方式可以进行字符串初始化,代码如下: var emptyString1 = ""
var emptyString2 = String()
这样就创建了一个空字符串,可以用字符串的isEmpty属性来检验: if emptyString1.isEmpty{
println("emptyString1 is empty")
}
if emptyString2.isEmpty{
println("emptyString2 is empty")
}
输出结果是: emptyString1 is empty
emptyString2 is empty
字符串拼接字符串之间可以相加,等号左侧必须是变量,不能是常量。 var combine1 = "u{1112}"
let combine2 = "u{1112}u{1161}"
combine1 += combine2 //正确
combine2 += combine1 //错误
var char:Character = "a"
combine1.append(char) //正确
combine1.append("a") //即使写成这样也会报错,原因不明,可能是推导为String类型了
字符串计数由于一个字符由若干个Unicode标量组成,所以无法使用字符串大小除以单个字符串大小来计算字符串长度。可以利用count方法来计算字符串长度: let stringValue1 = "Hello,world"
let stringValue2 = "u{65}u{301}"
println("string1 length = (count(stringValue1))") println("string2 length = (count(stringValue2))") println("string2 = (stringValue2)")
之前说过字符的自动拼接,所以运行结果如下:
字符串内插这个类似于OC中的NSString stringWithFormat方法。可以通过已有字符串或数字等其他变量构建一个新的字符串,通过一个例子演示一下: var number = 3
var time = 2
var setence = "(number)的 (time)倍是 (number * time)"
println("setence = (setence)")
对应到OC的方法,就相当于用”()”替换了”%@”。 字符串比较通过 == 和 != 运算符来比较字符串是否相等 比较特殊的一点是,swift在比较两个字符串时,并不会逐一比较每个Unicode标量是否相等,而是会根据字符串的实际语义来比较。所以在下面的例子中,比较结果需要特别留心一下: var compare1 = "cafu{E9}" //u{E9}是带声调的e,形如e?
var compare2 = "cafu{65}u{301}" //这是字母e加上声调合成的e?
if compare1 == compare2{
//它们依然是相等的
println("(compare1) is equal to (compare2)")
}
var compare3 = "u{41}" //拉丁字母A
var compare4 = "u{0410}" //斯拉夫字母A
if compare3 != compare4{
//虽然表现相同,但实际语义不同,所以字符串依然不同
println("(compare3) is not equal to (compare4)")
}
运行结果如下:
字符串前后缀字符串有hasPrefix和hasSuffix方法,用于判断这个字符串是否包含某个前(后)缀,返回一个Bool类型值。注意这两个方法是区分大小写的 var preFixAndSuffix = "Hello World"
if preFixAndSuffix.hasPrefix("H"){
println("(preFixAndSuffix) has prefix "H"")
}
if preFixAndSuffix.hasPrefix("h"){
println("(preFixAndSuffix) has prefix "h"")
}
if preFixAndSuffix.hasSuffix("rld"){
println("(preFixAndSuffix) has suffix "rld"")
}
if preFixAndSuffix.hasSuffix("rldd"){
println("(preFixAndSuffix) has suffix "rldd"")
}
输出结果: Hello World has prefix "H"
Hello World has suffix "rld"
附录查看完整专栏——《Swift轻松入门》【Swift入门(一)——基本语法】 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |