swift 处理字符串

对比OC的字符串api方法,补充Swift下的调用

OC中对于字符串NSString的截取所提供的api简单明了,如下

//截取掉下标7之前的字符串
NSString *string1 = @"123456789";
string1 = [string1  substringToIndex:7];//(length为7)
NSLog(@"截取的值为:%@",string1);//输出结果为1234567

//截取掉下标2之后的字符串
NSString *string2 = @"123456789";
string2  = [string2 substringFromIndex:2];
NSLog(@"截取的值为:%@",string2);//输出结果为3456789

//截取字符串最后3位
NSString *string3 = @"123456789";
string3 = [string3 substringFromIndex:string3.length- 3];
NSLog(@"截取的值为:%@",string3);//输出结果为789

//即当截取字符串后n位时,公式为:
//string = [sting substringfromIndex:string.length-n];

现在在swift中就不支持这样操作了,String的下标方法,根本不支持Int类型的下标

subscript(bounds: Range<String.Index>) -> String { get }
    Accesses the text in the given range.
subscript(i: String.Index) -> Character { get }
    Accesses the character at the given position.
subscript(bounds: ClosedRange<String.Index>) -> String { get }
    Accesses the text in the given range.

Swift标准库只支持的三种下标访问String字符串的方法

Range<String.Index>:元素为String.Index类型的Range(开区间)
String.Index:String.Index元素
ClosedRange<String.Index>:元素为String.Index类型的CloseRange(闭区间)

所以swift中字符串的截取操作只能是如下例子

let str = "Hello World"

let oneChar = str[str.startIndex] "H"
let twoChar = str[str.index(after: str.startIndex)] "e"
let zeroChar = str[str.index(before: str.endIndex)] "d"
let threeChar = str[str.index(str.startIndex, offsetBy: 1)] "e"
let fourChar = str[str.index(str.startIndex, offsetBy: 2)] "l"
let fiveChar = str[str.index(str.startIndex, offsetBy: 0)] "H"

/**
   str.endIndex,这个index索引并不是最后一个d字母,而是字符串的“结束后”位置——即比最后一个有效下标参数大1的位置。
    所有直接str[str.endIndex]是会导致越界崩溃的
*/
//let sixChar = str[str.endIndex]
let sevenChar = str[str.index(str.endIndex, offsetBy: -1)] "d"
let eightChar = str[str.index(str.endIndex, offsetBy: -2)] "l"
let nineChar = str[str.startIndex..<str.endIndex] "Hello World"
let tenChar = str[str.startIndex...str.index(before: str.endIndex)] "Hello World"

/**
    let temp = str[0]
    let temp = str[1]
    let temp = str[2]
    let temp = str[3]
 */
//等价于下面写法
let temp0 = str[str.index(str.startIndex, offsetBy: 0)] "H"
let temp00 = str[str.startIndex] "H"
let temp1 = str[str.index(str.startIndex, offsetBy: 1)] "e"
let temp2 = str[str.index(str.startIndex, offsetBy: 2)] "l"
let temp3 = str[str.index(str.startIndex, offsetBy: 3)] "l"

我就纳闷了截取给字符要写这么多代码,这不符合程序员偷懒的特性,还好我们可以通过extension来扩展String的截取方法,分别通过重新定义下标subscript跟自定义func来解决

extension String {
    /// 截取到任意位置
    func subString(to: Int) -> String {
        let index: String.Index = self.index(startIndex, offsetBy: to)
        return String(self[..<index])
    }
    /// 从任意位置开始截取
    func subString(from: Int) -> String {
        let index: String.Index = self.index(startIndex, offsetBy: from)
        return String(self[index ..< endIndex])
    }
    /// 从任意位置开始截取到任意位置
    func subString(from: Int, to: Int) -> String {
        let beginIndex = self.index(self.startIndex, offsetBy: from)
        let endIndex = self.index(self.startIndex, offsetBy: to)
        return String(self[beginIndex...endIndex])
    }
    //使用下标截取到任意位置
    subscript(to: Int) -> String {
        let index = self.index(self.startIndex, offsetBy: to)
        return String(self[..<index])
    }
    //使用下标从任意位置开始截取到任意位置
    subscript(from: Int, to: Int) -> String {
        let beginIndex = self.index(self.startIndex, offsetBy: from)
        let endIndex = self.index(self.startIndex, offsetBy: to)
        return String(self[beginIndex...endIndex])
    }
}

所以通过自定义extension的方法来操作截取如下

//所以写法用自定义方法截取
let func1 = str.subString(to: 2) "He"
let func2 = str.subString(from: 4) "o World"
let func3 = str.subString(from: 2, to: 5) "llo"
//所以写法用下标方式获取
let subscript1 = str[0] ""
let subscript2 = str[1] "H"
let subscript3 = str[2, 5] "llo"

对应可变字符串可以插入、删除和替换,String提供了几个方法可以帮助实现这些操作。这些方法如下:

splice(_:atIndex:)。在索引位置插入字符串。

insert(_:atIndex:)。在索引位置插入字符。

removeAtIndex(_:)。在索引位置删除字符。

removeRange(_:)。删除指定范围内的字符串。

replaceRange(_:,with: String) 。使用字符串或字符替换指定范围内的字符串。

代码:

var str ="Swift"
print("原始字符串:\(str)")

 
str.splice("Objective-Cand ".characters, atIndex: str.startIndex)
print("插入字符串后:\(str)")

 

str.insert(".",atIndex: str.endIndex)    
print("插入.字符后:\(str)")

 

str.removeAtIndex(str.endIndex.predecessor())
print("删除.字符后:\(str)")

 

var startIndex =str.startIndex           
var endIndex =advance(startIndex, 9)     
var range =startIndex...endIndex     
str.removeRange(range)                
print("删除范围后:\(str)")

 

startIndex =str.startIndex
endIndex =advance(startIndex, 0)
range =startIndex...endIndex      
str.replaceRange(range,with: "C++")  
print("替换范围后:\(str)")



输出结果:
原始字符串:Swift
插入字符串后:Objective-C and Swift
插入.字符后:Objective-Cand Swift.
删除.字符后:Objective-Cand Swift
删除范围后:C and Swift
替换范围后:C++ and Swift
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值