Swift中String和NSString的一个不同之处
我们知道在Swift中String和NSString是可以互相转换使用的…额…应该是在绝大数情况下可以互相转换使用.在某些情况下可能还有一丝丝略微的差别:比如在涉及到处理字符串中字符索引的时候. 我们首先来看一下NSString的字符串替换功能: let string = "ABCDE"
let range = Range(uncheckedBounds: (1,4))
let nsRange = NSRange(range)
let str:NSString = NSString(string: string)
str.replacingCharacters(in: nsRange,with: "AAAA")
以上代码有几点需要注意:
各位来猜一下上面的代码最后一句的结果是神马!?如果你认为是”AAAAA”,那么恭喜你,猜错了!!!实际的结果是”AAAAAE”.你没看错! 你实际生成的Range为(1..<4)其中只有3个空间,即为BCD3个字符,你需要替换为”AAAA”,所以最后的结果为”AAAAAE”,如果你想结果为”AAAAA”,你只需要第二句改为: let range = Range(uncheckedBounds: (1,5))
即可.你也可以直接创建NSRange: let nsRange = NSMakeRange(1,4)
这样创建的是我们所需要的结果. 下面我们看一下上面相同的功能在String里又该如何写呢? 我们先尝试一下: let string = "ABCDE"
let range = Range(uncheckedBounds: (1,4))
string.replacingCharacters(in: range,with: "AAAA")
不出意外,编译器抱怨了!正如小琥那首歌—没.那.么.简.单… 看一下错误信息,原来两种范围类型不可以互相转换的,正确的写法如下: let idx1 = string.characters.index(after: string.startIndex)
let idxRange = idx1..<string.characters.index(idx1,offsetBy: 4)
string.replacingCharacters(in: idxRange,with: "AAAA")
超复杂的,有木有… ;) 原来低版本Swift中的startIndex.successor()和advance()方法都以废弃,所以在Swift3.0中你只有按如上方式来写了.最后把老版本Swift中的写法贴出来: let string = "ABCDE"
let nsRange = NSMakeRange(1,4)
string.stringByReplacingCharactersInRange(nsRange,withString: "AAAA")
let indexPositionOne = string.startIndex.successor()
let swiftRange = indexPositionOne..<advance(indexPositionOne,4)
string.stringByReplacingCharactersInRange(swiftRange,withString: "AAAA")
注意:以上代码不能用在Swift3.0中! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |