Swift4学习笔记3——String和Character
来源:互联网 发布:鹿鼎记 知乎 编辑:程序博客网 时间:2024/06/06 02:22
为啥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 ontill you come to the end; then stop.""""
开始的三个引号的第一行后面的空格都会忽略,但是第二行的空格不会。
Character相比于C和java来讲有区别,如果要创建一个Character,必须显式声明类型
var c1:Character = "c" //注意是双引号var c2 = "c" //c2被认为是String类型var c3 = 'c' //编译错误Character可以赋值为Unicodelet 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]// Ggreeting[greeting.index(before: greeting.endIndex)]// !greeting[greeting.index(after: greeting.startIndex)]// ulet 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.endIndexwelcome.removeSubrange(range)// welcome now equals "hello"
Swift引入了一个SubString类,用来截串。终于不用Swift2恶心的那套了。直接上官方代码
let greeting = "Hello, world!"let index = greeting.index(of: ",") ?? greeting.endIndexlet beginning = greeting[..<index]// beginning is "Hello"但是注意SubString可能会用到原来string的内存。官方建议是短时间使用,如果想要长时间保持,需要转为String// Convert the result to a String for long-term storage.let newString = String(beginning)
另外一种方法就是将String转换为NSString,然后调用NSString的截串方法
var str = "123456789"var ns = (str as NSString).substringWithRange(NSMakeRange(1, 4))print(ns) //输出 2345
这些都是麻烦的方法,最好就是写一个extension来扩展String,先附上代码
import Foundationextension 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)] }}
- Swift4学习笔记3——String和Character
- Swift学习笔记3——String和Character
- Swift4 学习笔记——基础篇
- Swift4 学习笔记——高级篇
- Swift4学习笔记4——集合类型
- Swift4学习笔记5——流程控制语句
- Swift4学习笔记6——函数(Function)
- Swift4.0 — 属性
- Swift4学习笔记-0 写在开始之前
- Swift4学习笔记-1.1 关于Swift
- Swift4学习笔记-1.2 版本兼容性
- Swift4学习笔记-1.3 Swift之旅
- String和Character
- 【JavaSE_学习笔记】Integer和Character
- Swift4.0新特性之String、Array和Dictionary
- JAVA学习记录(一)——Number\Character\String\数组\Date\Calendar\GregorianCalendar
- Leetcode学习(38)—— First Unique Character in a String
- 【C++】学习笔记三十五——函数和string对象
- Java的根类Object
- 移动硬盘无法被电脑识别
- 新闻客户端
- window下安装solr到tomcat中
- 网络——代理服务器和NAT技术
- Swift4学习笔记3——String和Character
- Three.js 蒙皮动画源码分析图(留坑)
- 面向对象思想
- "Do Deep Nets Really Need to be Deep?"阅读笔记
- 2.3.6--Count the Trees
- bzoj 4011: [HNOI2015]落忆枫音 拓扑序dp+容斥原理
- There is a cycle in the hierarchy解决办法
- bzoj3529 [ SDOI2014 ] -- 莫比乌斯反演+分块
- Keepalived(一)在CentOS7下安装和运行Keepalived