请移步到更新的文章,更新到Swift4
为啥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()
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(self.characters.count) //3
String的Index,这个蛋疼啊!不像java里面的Index直接就是一个数字。String的Index是在不同的extension中定义的。
先来看获得String里面的某个字符的过程,蛋疼。直接上官方文档
let greeting = "Guten Tag!"
greeting[greeting.startIndex]
// G
greeting[greeting.endIndex.predecessor()]
// !
greeting[greeting.startIndex.successor()]
// u
let index = greeting.index(greeting.startIndex, offsetBy: 7)
greeting[index]
// a
Swift2的方法
//截串的三个方法
str.substringWithRange(aRange: Range<Index>)
str.substringFromIndex(index: Index) //包含fromIndex那个字符
str.substringToIndex(index: Index) //不包含toIndex那个字符
利用上面的方法截串例子
var str = "123456789"
var range = Range<String.Index>(start:str.startIndex.advancedBy(1),end:str.endIndex.advancedBy(-4))
print(str.substringWithRange(range)) //输出 2345
var str = "123456789"
var ns = (str as NSString).substringWithRange(NSMakeRange(1, 4))
print(ns) //输出 2345
这些都是麻烦的方法,最好就是写一个extension来扩展String,先附上代码
import Foundation
extension String {
//获取字符串长度
var length : Int { return self.characters.count }
//获取部分字符串,如果不在范围内,返回nil.如果end大于字符串长度,那么截取到最后
subscript (start: Int, end: Int) -> String? {
if start > self.length || 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: length)
} 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.length - 1 || index < 0 {
return nil
}
return self[self.index(self.startIndex, offsetBy: index)]
}
}