你如何使用String.substringWithRange?

你如何使用String.substringWithRange?(或者,Ranges如何在Swift中工作?)

我还没有弄清楚如何String在Swift中获取a的子串:

var str = “Hello, playground”func test(str: String) -> String {
 return str.substringWithRange( /* What goes here? */ )}test (str)

我无法在Swift中创建一个Range。游乐场中的自动填充功能并不是非常有用 - 这就是它的建议:

return str.substringWithRange(aRange: Range<String.Index>)

我没有在Swift标准参考库中找到任何有帮助的内容。这是另一个疯狂的猜测:

return str.substringWithRange(Range(0, 1))

还有这个:

let r:Range<String.Index> = Range<String.Index>(start: 0, end: 2)return str.substringWithRange(r)

我已经看到其他答案(查找Swift字符串中的字符索引)似乎表明,因为它String是一种桥接类型NSString,“旧”方法应该有效,但是不清楚如何 - 例如,这也不起作用(似乎不是有效的语法):

let x = str.substringWithRange(NSMakeRange(0, 3))

思考?


慕雪6442864
浏览 1035回答 3
3回答

一只名叫tom的猫

您可以使用substringWithRange方法。它需要一个开始和结束String.Index。var&nbsp;str&nbsp;=&nbsp;"Hello,&nbsp;playground"str.substringWithRange(Range<String.Index>(start:&nbsp;str.startIndex,&nbsp;end:&nbsp;str.endIndex))&nbsp;//"Hello,&nbsp;playground"要更改开始和结束索引,请使用advancedBy(n)。var&nbsp;str&nbsp;=&nbsp;"Hello,&nbsp;playground"str.substringWithRange(Range<String.Index>(start:&nbsp;str.startIndex.advancedBy(2),&nbsp;end:&nbsp;str.endIndex.advancedBy(-1)))&nbsp;//"llo,&nbsp;playgroun"你仍然可以在NSRange中使用NSString方法,但是你必须确保使用这样的NSString:let&nbsp;myNSString&nbsp;=&nbsp;str&nbsp;as&nbsp;NSStringmyNSString.substringWithRange(NSRange(location:&nbsp;0,&nbsp;length:&nbsp;3))注意:正如JanX2所提到的,第二种方法对于unicode字符串是不安全的。

叮当猫咪

斯威夫特2简单let str = "My String"let subStr = str[str.startIndex.advancedBy(3)...str.startIndex.advancedBy(7)]//"Strin"斯威夫特3let startIndex = str.index(str.startIndex, offsetBy: 3)let endIndex = str.index(str.startIndex, offsetBy: 7)str[startIndex...endIndex]&nbsp; &nbsp; &nbsp; &nbsp;// "Strin"str.substring(to: startIndex)&nbsp; &nbsp; // "My "str.substring(from: startIndex)&nbsp; // "String"斯威夫特4substring(to:)并且substring(from:)已弃用Swift 4。String(str[..<startIndex])&nbsp; &nbsp; // "My "String(str[startIndex...])&nbsp; &nbsp; // "String"String(str[startIndex...endIndex])&nbsp; &nbsp; // "Strin"

慕莱坞森

对这种方法的权衡取得了一些非常有见地的观点,尤其是隐藏的性能影响。字符串不是简单的野兽,并且到达特定索引可能花费O(n)时间,这意味着使用下标的循环可以是O(n ^ 2)。你被警告了。您只需添加一个新subscript功能,该功能需要一个范围并用于advancedBy()步行到您想要的位置:import&nbsp;Foundationextension&nbsp;String&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;subscript&nbsp;(r:&nbsp;Range<Int>)&nbsp;->&nbsp;String&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;get&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;startIndex&nbsp;=&nbsp;self.startIndex.advancedBy(r.startIndex) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;endIndex&nbsp;=&nbsp;startIndex.advancedBy(r.endIndex&nbsp;-&nbsp;r.startIndex) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;self[Range(start:&nbsp;startIndex,&nbsp;end:&nbsp;endIndex)] &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;}}var&nbsp;s&nbsp;=&nbsp;"Hello,&nbsp;playground"println(s[0...5])&nbsp;//&nbsp;==>&nbsp;"Hello," &nbsp;&nbsp;&nbsp;&nbsp;println(s[0..<5])&nbsp;//&nbsp;==>&nbsp;"Hello"为了好玩,您还可以+在索引上添加运算符:func +<T: ForwardIndex>(var index: T, var count: Int) -> T {&nbsp; for (; count > 0; --count) {&nbsp; &nbsp; index = index.succ()&nbsp; }&nbsp; return index}s.substringWithRange(s.startIndex+2 .. s.startIndex+5)(我还不知道这个是否应该成为该语言的一部分。)
打开App,查看更多内容
随时随地看视频慕课网APP