????? swfit3.0更新了一段時間了肘迎,可是大大小小的坑沒那么容易踩完耀盗,這不调鬓,最近我在把我的一個OC開源框架(OC版git地址? )的swfit移植版(Swfit版git地址?)代碼升級過程中遇到了好些大大小小的坑,在此說下最令人糾結的‘坑’:
????? NSRange & Range<String.Index>
?????? swfit3.0大幅修改了一些API使之更安全补憾,更快捷漫萄,尤其是結構體那塊,幾乎面目全非了盈匾,像CGRectMake之類的方法都廢棄了腾务,如果你還在OC的編程思想里,那么翻車是不可避免的
? ? ? 特別是Range的這個改動削饵,怎么說呢岩瘦,特別的不適應,而且有的API又必須要NSRange這個屬性窿撬,但是怎么把Range<String.Index>轉(zhuǎn)成NSRange呢担钮?后來發(fā)現(xiàn)這個方法:
然后可以用它來給String添加一個擴展轉(zhuǎn)換:
extension String {
func nsRange(from range: Range<String.Index>) -> NSRange {
let from = range.lowerBound.samePosition(in: utf16)
let to = range.upperBound.samePosition(in: utf16)
return NSRange(location: utf16.distance(from: utf16.startIndex, to: from),length: utf16.distance(from: from, to: to))
}}
再寫一個Range<String.Index>轉(zhuǎn)成NSRange的擴展
extension String {
func range(from nsRange: NSRange) -> Range<String.Index>? {
guard? let from16 = utf16.index(utf16.startIndex, offsetBy: nsRange.location, limitedBy: utf16.endIndex),
let to16 = utf16.index(from16, offsetBy: nsRange.length, limitedBy: utf16.endIndex),
let from = String.Index(from16, within: self),
let to = String.Index(to16, within: self)
else { return nil }
return from ..< to
}}
好了,至此尤仍,Range<String.Index>和 NSRange的相互轉(zhuǎn)化就完成了
但是
這個擴展是建立在String的基礎上的箫津,也就是說靠的是String才能完成相互轉(zhuǎn)化,如果要直接轉(zhuǎn)化宰啦,鄙人暫時還不知道轉(zhuǎn)換渠道苏遥,望各位swfit大神指點