原文链接:http://www.jianshu.com/p/52e7580166ff

版本2:增加了Swift 2.0的语法,与Swift 1.2的语法相比,主要是:advance方法变成了advancedBy方法(但不是简单替换);没有了count方法,count(str)需要变成str.characters.count等。

  1. 字符串的定义

    var str1="hello, mandarava." //字符串变量
    let str2="hello, mandarava." //字符串常量
    let str3="" //空字符串
    let str4=String() //空字符串
  2. 字符的定义
    var char1:Character="m" //字符变量
    let char2:Character="m" //字符常量
  3. 字符串的连接
    let str1="hello, "
    let str2="mandarava."
    let str3=str1+str2 //=连接str1、str2
    //str3="hello, mandarava."
    //----------------------------------------
    let str4="\(str1)\(str2)" //=连接str1、str2
    //str4="hello, mandarava."
    //----------------------------------------
    let strArray=["apple", "orange", "cherry"]
    let joinStr=",".join(strArray)
    //joinStr="apple,orange,cherry"
  4. 字符串与字符的连接
    let char1:Character="o"
    var str1="hell"
    let str2=str1+String(char1)
    //str2="hello"
    //----------------------------------------
    let str3="\(str1)\(char1)"
    //str3="hello"
    //----------------------------------------
    str1.append(char1)
    //str1="hello"
  5. 字符串与其它类型值的连接
    let xx=10
    let yy=10.8
    let str1="\(xx)+\(yy)=?"
    //str1="10+10.8=?"
    //----------------------------------------
    let str2=String(format: "%i+%.1f=?", xx, yy)
    //str2="10+10.8=?"
  6. 字符串枚举字符
    //Swift 1.2
    let str="mandarava"
    for ch in str{
    println(ch)
    }
    //-----------------------
    //Swift 2.0
    let str="mandarava"
    for ch in str.characters{
    print(ch)
    }
  7. 获取字符串中指定索引处的字符
    let str="Mandarava"
    let chr=str[advance(str.startIndex,2)] //Swift 1.2 //chr:Character="n"
    let chr=str[str.startIndex.advancedBy(2)] //Swift 2.0 //chr:Character="n"
  8. 计算字符串长度length
    let str="@鳗驼螺"
    let len1=count(str) //swift 1.2 //=4
    let len2=str.characters.count //swift 2.0 //=4
    let blen=str.lengthOfBytesUsingEncoding(NSUTF8StringEncoding) //=10
  9. 字符串比较
    let str1="hello,"
    let str2="mandarava."
    let str3="hello,mandarava."
    let comp1 = str1==str2 //false
    let comp2 = str1+str2 == str3 //true
    let comp3 = str1 < str2 //true
    let comp4 = str1 != str2 //true
  10. 是否包含子串contains
    let str1="hello,mandarava."
    let str2="mandarava"
    let range=str1.rangeOfString(str2)
    if range != nil{
    //包含
    }
  11. 查找子串indexof
    var str="hi,Mandarava."
    let range=str.rangeOfString("Mandarava", options: NSStringCompareOptions.allZeros) //Swift 1.2
    let range=str.rangeOfString("Mandarava", options: NSStringCompareOptions()) //Swift 2.0
    let startIndex=range?.startIndex //=3
  12. 首字母大写capitalized
    var str1="mandarava is a flower."
    str1.capitalizedString
    //str1="Mandarava Is A Flower.
  13. 转换为大写字母uppercase
    var str1="hello, mandarava."
    str1=str1.uppercaseString
    //str1="HELLO, MANDARAVA."
  14. 转换为小写字母lowercase
    var str1="HELLO, MANDARAVA."
    str1=str1.lowercaseString
    //str1="hello, mandarava."
  15. 截取字符串substring
    let str1="hello,mandarava."
    let str2=str1.substringFromIndex(advance(str1.startIndex, 6)) //Swift 1.2
    let str2=str1.substringFromIndex(str1.startIndex.advancedBy(6)) //Swift 2.0
    //str2="mandarava."
    //----------------------------------------
    let str3=str1.substringToIndex(advance(str1.startIndex, 5)) //Swift 1.2
    let str3=str1.substringToIndex(str1.startIndex.advancedBy(5)) //Swift 2.0
    //str3="hello"
    //----------------------------------------
    let range=Range<String.Index>(start: advance(str1.startIndex, 6), end: advance(str1.endIndex, -1)) //Swift 1.2
    let range=Range<String.Index>(start: str1.startIndex.advancedBy(6), end: str1.endIndex.advancedBy(-1)) //Swift 2.0
    let str4=str1.substringWithRange(range)
    //str4="mandarava"
  16. 字符串修剪trim
    let str1=" mandarava.\n "
    let str2=str1.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())
    //str2="mandarava."
    //----------------------------------------
    let str3=str1.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceCharacterSet())
    //str3="mandarava.\n"
    //----------------------------------------
    let charset=NSCharacterSet(charactersInString:" \n")
    let str4=str1.stringByTrimmingCharactersInSet(charset)
    //str4="mandarava."
  17. 字符串的分解子串split
    var str1="boy, girl, man, woman"
    let str1Array=str1.componentsSeparatedByString(",")
    //str1Array=["boy", " girl", " man", " woman"]
    var str2="boy,girl,man 10 20 30"
    let charset=NSCharacterSet(charactersInString:", ")
    let str2Array=str2.componentsSeparatedByCharactersInSet(charset)
    //str2Array=["boy", "girl", "man", "10", "20", "30"]
  18. 字符串替换replace
    var str1="My name is Mandarava."
    let subRange=Range(start: str1.startIndex, end: advance(str1.startIndex, 2)) //Swift 1.2
    let subRange=Range(start: str1.startIndex, end: str1.startIndex.advancedBy(2)) //Swift 2.0
    str1.replaceRange(subRange, with: "Your")
    //str1="Your name is Mandarava."
    var str2="hello, Mandarava."
    str2=str2.stringByReplacingOccurrencesOfString("Mandarava", withString: "鳗驼螺")
    //str2="hello, 鳗驼螺."
    str2=str2.stringByReplacingOccurrencesOfString("鳗驼螺", withString: "Mandarava", options: NSStringCompareOptions.CaseInsensitiveSearch, range: nil)
    //str2="hello, Mandarava."
  19. string转换为Int/Long/Float/Double/Bool等
    var str1="100"
    var i=str1.toInt()! //Swift 1.2 //=100
    var i=(str1 as NSString).integerValue //Swift 2.0 //=100
    var i=(str1 as NSString).intValue //=100
    var l=(str1 as NSString).longLongValue //=100
    var str2="10.8"
    var f=(str2 as NSString).floatValue //=10.8
    var d=(str2 as NSString).doubleValue //=10.8
    var str3="true"
    var b=(str3 as NSString).boolValue //=true

Swift 的语法一直都在演变进化,在1.x到2.x的演变过程中也发生了很大的改变,在开源后发展更加迅速,即将发布的3.0版本也合并到了master.
字符串的处理也是变化的一部分,在最近的coding中遇到了一些频繁需要字符串处理的地方,过程中发现目前版本(2.x)字符串处理的语法实在有些啰嗦。

在Swift1.0 的时候字符串的截取是这样的:

var hp = "Hello, playground"
let hello = hp[0 ... 4] // error

如果在Swift2.x可以,那真是极好的。

我喜欢这种以自然数提取字符串的方式,可是在Swift2.x中已经摒弃。

在Swift2.x中需要这样写:

let hello = hp.substringWithRange(Range<String.Index>(start: hp.startIndex, end: hp.startIndex.advancedBy(5)))  // "Hello"

或者更简单点:

let hello = hp[hp.startIndex..<hp.startIndex.advancedBy(5)]  // "Hello"

当然用OC中的NSString也是可以的,只是...

var nsHp = hp as NSString
let hello = nsHp.substringWithRange(NSMakeRange(0, 5)) // "Hello"

因为在Swift2.x (应该是在Swift1.2以后吧)中用String.Index代替了自然数, 新的API 毫无疑问的会占用我仅仅16GB的记忆量,我不想调用新API中那些所谓的牛逼黑科技代码。

为什么一个简单的字符串处理需要写的这么啰嗦,这里很好的总结了这一切

其实我更喜欢python截取字符串的风格,简单粗暴。

hp = "Hello, playground"
hello = hp[0:5] // "Hello"
hello = hp[0:-12] // "Hello"

所以我决定对它做些改变:

扩展 Extension

Swift 中的扩展和 Objective-C 中的分类类似,(只是Swift 中扩展没有名字)

Swift中的扩展可以:

  • 添加计算型属性和计算型类型属性
  • 定义实例方法和类型方法
  • 提供新的构造器
  • 定义下标
  • 定义和使用新的嵌套类型
  • 使一个已有类型符合某个协议

下标 Subscripts

下标可以定义在类(class)、结构体(structure)和枚举(enumeration)中,是访问集合(collection),列表(list)或序列(sequence)中元素的快捷方式。

我现在添加String的扩展来定义下标,然后取出想要的字符串,下标接收Int类型的Range,Index 通过advancedBy(n)来递增,参数n是前进的个数,如果 n 大于 0 则会调用self的 successor() n 次,小于 0 则会调用 predecessor() n 次。

successor() 和 predecessor() 分别是可能出现的下一个值,和上一个值。

extension String {
subscript (r: Range<Int>) -> String {
get {
let startIndex = self.startIndex.advancedBy(r.startIndex)
let endIndex = self.startIndex.advancedBy(r.endIndex)
return self[Range(start: startIndex, end: endIndex)]
}
}
} let hello1 = hp[Range(start: 0, end: 5)] // "Hello"
let hello2 = hp[0 ..< 5] // "Hello"

自然数截取 极好的.

然而发现了问题,我要像python用下标从后向前取怎么办 :|

let hello = hp[0 ..< -12]    // "error"   ( system:不懂Range 别乱搞 :( )

不用Range 就是了:) 下面我将重新写一个接收两个参数下标方法,注意, 这里通过三元表达式来判断。在end 小于 0 时会 执行self.endIndex.advancedBy(end) , 前面有说到,也就是说会执行abs(end)次的predecessor()方法。

extension String {
subscript (start: Int, end: Int) -> String {
let s = self.startIndex.advancedBy(start)
let e = end < 0 ? self.endIndex.advancedBy(end) : self.startIndex.advancedBy(end)
return self[Range(start: s, end: e)]
}
}
let hello = hp[0, -12] // "Hello"

搞定!不过参数中[0, -12]中间的, 让整体像个Array ,感觉怪怪的,我不太喜欢,决定改掉。

自定义运算符

  • 自定义运算符可以由以下的 ASCII 字符 /、=、 -、+、!、*、%、<、>、&、|、^、? 、~自由组合.
  • 支持一元前缀 prefix (例如 --a, ++a, ! false)、一元后缀 postfix (a--, a++)、二元中置 infix (a+b, a-b, a==b)运算符
  • 支持自定义优先级

注:操作符前后空格也有规则,这里不多做说明,可自行查看官方文档。

在Swift中 : 归为字符,而非运算符,所以无法使用,我觉定用~来替代,创建一个二元中置运算符:

infix operator ~ {
precedence 250 // 优先级 0~255 的一个值,具体参考官方文档
associativity none // 结合 left, right, none
} func ~(start: Int, end: Int) -> (s: Int, e: Int) {
return (start, end) // 说好的运算符,除了返回个元组,啥也没干...
} extension String {
//接收元组的下标方法
subscript (myRange: (s: Int, e: Int)) -> String {
get {
let s = self.startIndex.advancedBy(myRange.s)
let e = myRange.e < 0 ? self.endIndex.advancedBy(myRange.e) : self.startIndex.advancedBy(myRange.e)
return self[Range(start: s, end: e)]
}
set {
let s = self.startIndex.advancedBy(myRange.s)
let e = myRange.e < 0 ? self.endIndex.advancedBy(myRange.e) : self.startIndex.advancedBy(myRange.e)
str.replaceRange(Range(start: s, end: e), with: newValue)
}
}
} let hello = hp[0 ~ 5] // "Hello"
hp[7 ~ 17] = "dimsky" // "Hello, dimsky"

没错,我在下标方法加了个set 方法用来替换指定下标的值。

可能有人对 advanceBy 这个方法还不太理解,下面我将用 + 运算符来替代这个方法:

func +<T: BidirectionalIndexType>(var index: T, count: Int) -> T {
let num = abs(count)
for _ in 0..<num {
index = count < 0 ? index.predecessor() : index.successor()
}
return index
} let hello = str[str.startIndex ..< str.startIndex.advancedBy(5)] // "hello"
let play = str[str.startIndex + 7 ..< str.startIndex + 11] // "play" let play2 = str[str.startIndex + 7 ..< str.endIndex + -6] // "play"
let helloPlay = str[str.startIndex ..< str.endIndex.advancedBy(-6)] // "Hello, play"

我们可能还会需要经常的获取字符的下标,这是Swift 中正常获取字符所在下标的方法:

let index1 = hp.rangeOfString("H")?.startIndex  // 0 (String.CharacterView.Index)
let index2 = hp.rangeOfString("o")?.endIndex // 5 (String.CharacterView.Index)

是的,我们没法通过上面的方法去直接获得自然数的下标,所以就有了下面的扩展方法:

extension String {
func indexOfString(target: String) -> Int {
let range = self.rangeOfString(target)
if let range = range {
return self.startIndex.distanceTo(range.startIndex)
} else {
return -1
}
}
} let index = hp.indexOfString("o") // 5 (Int)

当然接下来可以玩的还有很多
比如字符串替换:

hp["playground"] = "三上悠亚"   // waiting for you to complete

hp.stringByReplacingOccurrencesOfString("playground", withString: "铃原エミリ") //   "Hello, 铃原エミリ"  延用了OC的API
原文链接:http://www.jianshu.com/p/52b7b333d41c

Swift 常用字符串操作的更多相关文章

  1. [转载]c++常用字符串操作函数

    原文地址:c++常用字符串操作函数作者:Valsun 函数名: stpcpy 功 能: 拷贝一个字符串到另一个 用 法: char *stpcpy(char *destin, char *source ...

  2. Js 常用字符串操作 API

    常用的一些字符串操作 API 整理 1.str.charAt(index).str.charCodeAt(index) - 返回指定位置的字符 / 字符编码(0~65535) index - 必须,表 ...

  3. 整理:C#常用字符串操作,常用数值类型转换

    一.字符串操作 1. 字符串连接 //将指定的数组所有元素拼接为一个字符串 string[] arr = {"A","B","C"}; st ...

  4. C语言的常用字符串操作函数(一)

    一直做的是单片机相关的程序设计,所以程序设计上更偏向底层,对于字符串的操作也仅限于液晶屏幕上的显示等工作,想提高下字符串操作的水平,而不是笨拙的数组替换等方式,翻看帖子发现C语言的字符串操作函数竟然这 ...

  5. mysql常用字符串操作函数大全,以及实例

    今天在论坛中看到一个关于mysql的问题,问题如下 good_id     cat_id12654         665,56912655         601,4722 goods_id是商品i ...

  6. JS 常用字符串操作

    Js字符串操作函数大全 /*******************************************                        字符串函数扩充              ...

  7. C++常用字符串操作和UTF-8和GBK之间的转换以及判定(转)

    编码转换原文地址:https://www.cnblogs.com/Toney-01-22/p/9935297.html C++字符串常用操作:C++ 中字符串查找.字符串截取.字符串替换

  8. VB常用字符串操作函数

    1. ASC(X),Chr(X):转换字符字符码 [格式]: P=Asc(X) 返回字符串X的第一个字符的字符码 P=Chr(X) 返回字符码等于X的字符 [范例]: (1)P=Chr(65) ‘ 输 ...

  9. PHP常用字符串操作函数实例总结(trim、nl2br、addcslashes、uudecode、md5等)

    /*常用的字符串输出函数 * * echo() 输出字符串 * print() 输出一个或多个字符串 * die() 输出一条信息,并退出当前脚本 * printf() 输出格式化字符串 * spri ...

随机推荐

  1. Linux的网卡由eth0变成了eth1,如何修复

    Linux的网卡由eth0变成了eth1,如何修复   使用wmware安装了linux,安装成功后,使用的网卡是eth0,没有eth1.但是用过一段时间后,不知道为什么eth0无法使用,系统却自动生 ...

  2. HUST 1404 Hamming Distance(字符串)

    Hamming Distance Description Have you ever heard of the Hamming distance. It is the number of positi ...

  3. 重装系统之后Hexo快速配置

    安装准备软件 Node.js Git 打开 Git Bash hexo文件夹,右键: 配置SSH Keys 检查SSH keys设置,看一下电脑现有的ssh key cd ~/. ssh 检查本机的s ...

  4. LeetCode OJ 229. Majority Element II

    Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋ times. The algorit ...

  5. chapter11_2 Lua链表与队列

    链表 由于table是动态的实体,所以在Lua中实现链表是很方便的.每个节点以一个table来表示,一个“链表”只是节点table中的一个字段. 该字段包含了对其他table的引用.例如,要实现一个基 ...

  6. ThinkPHP模板

    [MVC模式] M:Model 数据模型层,负责数据操作 V:View 视图层,负责显示视图 C:Controller 控制器,实现业务逻辑 tp框架url地址可以由以下四种 http://网址/in ...

  7. 安装cocoapods遇到的一些问题

    其实可以直接到https://github.com/CocoaPods/Specs上把所需的文件夹下载下来 解压后命名为master放在本地的 ~/.cocoapods/repos  下面就行 但是使 ...

  8. HDU 5798 Stabilization

    方法太厉害了....看了官方题解的做法....然后...想了很久很久才知道他想表达什么.... #pragma comment(linker, "/STACK:1024000000,1024 ...

  9. VBS 文件选择框,选择Excel文件

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 on error resume Next Set objDialog=CreateObject("UserAcc ...

  10. Chapter 1 First Sight——33

    At that moment, the bell rang loudly, making me jump, and Edward Cullen was out of his seat. 在这个时候,铃 ...