原文链接: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. sed 一些用法

    sed  /^[[:space:]]*$/d        删除空行 sed "/^$/d"         删除空行 sed "/^#/d"     删除 开 ...

  2. Excel教程(12) - 数学和三角函数

    ABS     用途:返回某一参数的绝对值.   语法:ABS(number) 参数:number 是需要计算其绝对值的一个实数. 实例:如果 A1=-16,则公式"=ABS(A1)&quo ...

  3. From windows live writer

    天线数据长度: 4*14*9664*4 = 2164736 信道估计长度: 614400 均衡: 12*1200*4 = 57600

  4. 关于jquery选择器中:first和:first-child和:first-of-type的区别及:nth-child()和:nth-of-type()的区别

    :first:选择第一个出现符合的元素 :first-child:选择限制条件中的第一个元素,并且必须和冒号前面的标签一致 :first-of-type:选择所有限制条件下的第一个冒号前面的标签元素, ...

  5. urllib2 之info 学习

    之前介绍了根据old_url获取真实url的geturl的方法,而根据urlopen返回的应答对象的info方法可以获取服务器发送头部headers的内容,并且通过字典形式反馈出来,同样测试代码如下: ...

  6. UI-text-field

    //初始化textfield并设置位置及大小 UITextField *text = [[UITextField alloc]initWithFrame:CGRectMake(20, 20, 130, ...

  7. 使用纯css3实现图片轮播

    <!DOCTYPE html> <html> <head> <title> 飛天网事--纯CSS代码实现图片轮播 </title> < ...

  8. python_变量的命名规则

    python 变量的命名规则: 1. 要具有描述性 2.变量名只能由 数字,字母 ,下划线 组成,不可以是空格或者特殊字符(#!%……&) 3.不能以数字开头 4.保留字符不可用(print ...

  9. Android:如何实现更换主题

    关键代码:setTheme(int ID); 注意点: 1.设置主题必须要在setContentView() 之前调用,所以需要写个Intent去重新开启Activity. 2.为了切换主题保证流畅性 ...

  10. Oracle字符串操作[转:http://www.cnblogs.com/xd502djj/archive/2010/08/11/1797577.html]

    ORACLE 字符串操作 1 字符串连接   SQL> select 'abc' || 'def' from dual; 'ABC'|------abcdef 2 小写SQL>select ...