欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Swift4学习笔记3——String和Character

程序员文章站 2022-05-31 17:16:37
...

为啥String和Character要单独拿出来讲呢?因为和C区别蛮大的,而且经常用到。感觉Swift的String还是没有Java的String好用。比如截串就是个麻烦的事情。以后String可能还会更新,让String变得更加好用。
需要注意的是,Swift中的String是值传递。附上String 的定义就明白了。

public struct String {
    /// An empty `String`.
    public init()
}

开始就是创建字符串,最简单的方法如下

var str = "I  am a string"

//创建空串的两种方法,二者是一样的

var emptyStr1 = ""
var emptyStr2 = String()

使用三个引号来创建一段话的string

let quotation = """
The White Rabbit put on his spectacles.  "Where shall I begin,
please your Majesty?" he asked.

"Begin at the beginning," the King said gravely, "and go on
till you come to the end; then stop."
"""

开始的三个引号的第一行后面的空格都会忽略,但是第二行的空格不会。
Character相比于C和java来讲有区别,如果要创建一个Character,必须显式声明类型

var c1:Character = "c"  //注意是双引号
var c2 = "c"  //c2被认为是String类型
var c3 = 'c'  //编译错误

Character可以赋值为Unicode
let eAcute: Character = "\u{E9}"      // é

改变String,这个语法和java一样的,不过内存管理层面已经是不同的对象了。

var str:String = "first"
var c1:Character = "c"  //注意是双引号
var c2 = "c"  //c2被认为是String类型
str += "sceond"   //str变为firstsceond,此时的str和之前的str内存地址不同
str += c2     //str变为firstc,此时的str和之前的str内存地址不同
str.appendContentsOf("second") // 和使用+=是一样的
str.appendContentsOf(c2)  //和使用+=是一样的
str.append(c1);  //添加Character的方法

遍历String字符的两种方法

var str:String = "first"
for c in str.characters {
    print(c)
}
for index in str.characters.indices {
    print(str[index])
}

获取String长度的办法

var s = "dfe"
print(s.count)  //3

但是要注意,swift里面有extended grapheme clusters(An extended grapheme cluster is a sequence of one or more Unicode scalars that (when combined) produce a single human-readable character.) 也就是几个Unicode字符组合成一个人类可以识别的字符。
所以,当string里面添加了characters后,count不一定会增加。
string的count不一定和NSString的length一致。
(The length of an NSString is based on the number of 16-bit code units within the string’s UTF-16 representation and not the number of Unicode extended grapheme clusters within the string.)

String的Index,这个蛋疼啊!不像java里面的Index直接就是一个数字。String的Index是在不同的extension中定义的。
先来看获得String里面的某个字符的过程,蛋疼。直接上官方文档

let greeting = "Guten Tag!"
greeting[greeting.startIndex]
// G
greeting[greeting.index(before: greeting.endIndex)]
// !
greeting[greeting.index(after: greeting.startIndex)]
// u
let index = greeting.index(greeting.startIndex, offsetBy: 7)
greeting[index]
// a

插入和移除字符

var welcome = "hello"
welcome.insert("!", at: welcome.endIndex)
// welcome now equals "hello!"

welcome.insert(contentsOf: " there", at: welcome.index(before: welcome.endIndex))
// welcome now equals "hello there!"
welcome.remove(at: welcome.index(before: welcome.endIndex))
// welcome now equals "hello there"

let range = welcome.index(welcome.endIndex, offsetBy: -6)..<welcome.endIndex
welcome.removeSubrange(range)
// welcome now equals "hello"

Swift引入了一个SubString类,用来截串。终于不用Swift2恶心的那套了。直接上官方代码

let greeting = "Hello, world!"
let index = greeting.index(of: ",") ?? greeting.endIndex
let beginning = greeting[..<index]
// beginning is "Hello"
但是注意SubString可能会用到原来string的内存。官方建议是短时间使用,如果想要长时间保持,需要转为String
// Convert the result to a String for long-term storage.
let newString = String(beginning)

Swift4学习笔记3——String和Character

另外一种方法就是将String转换为NSString,然后调用NSString的截串方法

var str = "123456789"
var ns = (str as NSString).substringWithRange(NSMakeRange(1, 4))
print(ns) //输出  2345

这些都是麻烦的方法,最好就是写一个extension来扩展String,先附上代码

import Foundation

extension String {
    //获取部分字符串,如果不在范围内,返回nil.如果end大于字符串长度,那么截取到最后
    subscript (start: Int, end: Int) -> String? {
        if start > self.count || start < 0 || start > end {
            return nil
        }
        let begin = self.index(self.startIndex, offsetBy: start)
        var terminal: Index
        if end >= length {
            terminal = self.index(self.startIndex, offsetBy: count)
        } else {
            terminal = self.index(self.startIndex, offsetBy: end + 1)
        }
        let range = (begin ..< terminal)
        return self.substring(with: range)
    }
    //获取某个字符,如果不在范围内,返回nil
    subscript (index: Int) -> Character? {
        if index > self.count - 1 || index < 0 {
            return nil
        }
        return self[self.index(self.startIndex, offsetBy: index)]
    }
}
相关标签: swift string