Swift入门(二)——字符与字符串

前端之家收集整理的这篇文章主要介绍了Swift入门(二)——字符与字符串前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

Swift字符

定义

Swift中的字符,与OC有些不同,每一个字符代表了一个可拓展的字母集,可拓展的字母集由若干个(大于等于一个)Unicode标量值表示,这些标量构成了一个可拓展的字母集,也就是一个人类可读的字符。

Unicode标量

一个Unicode标量占据21个比特位,一般格式为“U+xxxx”,这个解释有点抽象,其实我们通常理解的一个字母,也可以用一个Unicode标量来表示,比如字母’a’可以表示为”U+0061”。

刚刚说到,一个字符由若干个Unicode标量表示,比如以下这个例子:

  1. let combine1 = "\u{1112}"
  2. let combine2 = "\u{1112}\u{1161}"
  3. let combine3 = "\u{1112}\u{1161}\u{11AB}"
  4.  
  5. println("combine1 = \(combine1)") println("combine2 = \(combine2)") println("combine3 = \(combine3)")

输出结果是

combine1 = ᄒ
combine2 = 하
combine3 = 한

可见,对于一个字符,并不一定是由一个Unicode标量构成的。比如“한”。

字符类型推导

刚刚的例子中,我们定义了三个常量,combine0,,combine1,combine2,他们被推导为什么类型呢?答案是String类型而不是Character类型,个人猜测是Swfit的宽类型优先导致的。这里通过简单的代码验证一下:

  1. var combine0 = "\u{1112}"
  2. var combine1:Character = "\u{1112}"
  3.  
  4. combine0 += "abc" //正确
  5. combine1 += "abc" //编译错误:无法将String类型与Character类型变量拼接

字符拼接

在初始化字符类型常量或变量时,Swift会自动把能够拼接的Unicode标量拼接成一个人类可读字符,如果不能拼接,将生成一个由多个字符所组成的字符串。把这个值赋给一个已经标注为Character类型的变量会导致编译错误

  1. var string = "\u{1112}\u{10FFFF}" //正确,string变量被推导为String类型
  2. var c:Character = "\u{1112}\u{10FFFF}" //错误,无法赋值给Character类型变量

Swift字符串

定义

Swift中的字符串由若干个字符构成。

字符串初始化

一共有两种方式可以进行字符串初始化,代码如下:

  1. var emptyString1 = ""
  2. var emptyString2 = String()

这样就创建了一个空字符串,可以用字符串的isEmpty属性来检验:

  1. if emptyString1.isEmpty{
  2. println("emptyString1 is empty")
  3. }
  4. if emptyString2.isEmpty{
  5. println("emptyString2 is empty")
  6. }

输出结果是:

  1. emptyString1 is empty
  2. emptyString2 is empty

字符串拼接

字符串之间可以相加,等号左侧必须是变量,不能是常量。
字符串变量还可以调用append方法连接其他字符。需要注意的是,append方法只能连接字符,不能连接字符串。

  1. var combine1 = "\u{1112}"
  2. let combine2 = "\u{1112}\u{1161}"
  3.  
  4. combine1 += combine2 //正确
  5. combine2 += combine1 //错误
  6.  
  7. var char:Character = "a"
  8. combine1.append(char) //正确
  9. combine1.append("a") //即使写成这样也会报错,原因不明,可能是推导为String类型了

字符串计数

由于一个字符由若干个Unicode标量组成,所以无法使用字符串大小除以单个字符串大小来计算字符串长度。可以利用count方法来计算字符串长度:

  1. let stringValue1 = "Hello,world"
  2. let stringValue2 = "\u{65}\u{301}"
  3. println("string1 length = \(count(stringValue1))") println("string2 length = \(count(stringValue2))") println("string2 = \(stringValue2)")

之前说过字符的自动拼接,所以运行结果如下:

string1 length = 12
string2 length = 1
string2 = é

字符串内插

这个类似于OC中的NSString stringWithFormat方法。可以通过已有字符串或数字等其他变量构建一个新的字符串,通过一个例子演示一下:

  1. var number = 3
  2. var time = 2
  3. var setence = "\(number)的 \(time)倍是 \(number * time)"
  4. println("setence = \(setence)")

对应到OC的方法,就相当于用”\()”替换了”%@”。
需要注意的是,内插的表达式中不能直接包含双引号、单引号或者反斜杠。

字符串比较

通过 == 和 != 运算符来比较字符串是否相等

比较特殊的一点是,swift在比较两个字符串时,并不会逐一比较每个Unicode标量是否相等,而是会根据字符串的实际语义来比较。所以在下面的例子中,比较结果需要特别留心一下:

  1. var compare1 = "caf\u{E9}" //\u{E9}是带声调的e,形如é
  2. var compare2 = "caf\u{65}\u{301}" //这是字母e加上声调合成的é
  3. if compare1 == compare2{
  4. //它们依然是相等的
  5. println("\(compare1) is equal to \(compare2)")
  6. }
  7.  
  8. var compare3 = "\u{41}" //拉丁字母A
  9. var compare4 = "\u{0410}" //斯拉夫字母A
  10. if compare3 != compare4{
  11. //虽然表现相同,但实际语义不同,所以字符串依然不同
  12. println("\(compare3) is not equal to \(compare4)")
  13. }

运行结果如下:

café is equal to café
A is not equal to А

字符串前后缀

字符串有hasPrefix和hasSuffix方法,用于判断这个字符串是否包含某个前(后)缀,返回一个Bool类型值。注意这两个方法是区分大小写的

  1. var preFixAndSuffix = "Hello World"
  2. if preFixAndSuffix.hasPrefix("H"){
  3. println("\(preFixAndSuffix) has prefix \"H\"")
  4. }
  5. if preFixAndSuffix.hasPrefix("h"){
  6. println("\(preFixAndSuffix) has prefix \"h\"")
  7. }
  8. if preFixAndSuffix.hasSuffix("rld"){
  9. println("\(preFixAndSuffix) has suffix \"rld\"")
  10. }
  11. if preFixAndSuffix.hasSuffix("rldd"){
  12. println("\(preFixAndSuffix) has suffix \"rldd\"")
  13. }

输出结果:

  1. Hello World has prefix "H"
  2. Hello World has suffix "rld"

附录

查看完整专栏——《Swift轻松入门》

【Swift入门(一)——基本语法】
【Swift入门(二)——字符与字符串】
【Swift入门(三)——元组(Tuple)】
【Swift入门(四)——可选类型(Optionals)与断言(Assert)】
【Swift入门(五)——数组(Array)】
【Swift入门(六)——字典(Dictionary)】
【Swift入门(七)——结构体(Struct)】
【Swift入门(八)——功能强大的求余运算符】
【Swift入门(九)——String与Int、Double、Float等数字相互转换】
【Swift入门(十)——循环引用、弱引用和无主引用】
【Swift入门(十一)——类型转换与is、as操作】
【Swift入门(十二)——利用Extension添加逆序输出字符串方法】

猜你在找的Swift相关文章