为了账号安全,请及时绑定邮箱和手机立即绑定

你如何使用String.substringWithRange?

你如何使用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))思考?
查看完整描述

3 回答

?
一只名叫tom的猫

TA贡献1906条经验 获得超3个赞

您可以使用substringWithRange方法。它需要一个开始和结束String.Index。

var str = "Hello, playground"str.substringWithRange(Range<String.Index>(start: str.startIndex, end: str.endIndex)) //"Hello, playground"

要更改开始和结束索引,请使用advancedBy(n)。

var str = "Hello, playground"str.substringWithRange(Range<String.Index>(start: str.startIndex.advancedBy(2), end: str.endIndex.advancedBy(-1))) //"llo, playgroun"

你仍然可以在NSRange中使用NSString方法,但是你必须确保使用这样的NSString:

let myNSString = str as NSStringmyNSString.substringWithRange(NSRange(location: 0, length: 3))

注意:正如JanX2所提到的,第二种方法对于unicode字符串是不安全的。


查看完整回答
反对 回复 2019-07-31
?
叮当猫咪

TA贡献1776条经验 获得超12个赞

斯威夫特2

简单


let str = "My String"

let subStr = str[str.startIndex.advancedBy(3)...str.startIndex.advancedBy(7)]

//"Strin"

斯威夫特3

let startIndex = str.index(str.startIndex, offsetBy: 3)

let endIndex = str.index(str.startIndex, offsetBy: 7)


str[startIndex...endIndex]       // "Strin"

str.substring(to: startIndex)    // "My "

str.substring(from: startIndex)  // "String"

斯威夫特4

substring(to:)并且substring(from:)已弃用Swift 4。


String(str[..<startIndex])    // "My "

String(str[startIndex...])    // "String"

String(str[startIndex...endIndex])    // "Strin"


查看完整回答
反对 回复 2019-07-31
?
慕莱坞森

TA贡献1810条经验 获得超4个赞

对这种方法的权衡取得了一些非常有见地的观点,尤其是隐藏的性能影响。字符串不是简单的野兽,并且到达特定索引可能花费O(n)时间,这意味着使用下标的循环可以是O(n ^ 2)。你被警告了。

您只需添加一个新subscript功能,该功能需要一个范围并用于advancedBy()步行到您想要的位置:

import Foundationextension String {
    subscript (r: Range<Int>) -> String {
        get {
            let startIndex = self.startIndex.advancedBy(r.startIndex)
            let endIndex = startIndex.advancedBy(r.endIndex - r.startIndex)

            return self[Range(start: startIndex, end: endIndex)]
        }
    }}var s = "Hello, playground"println(s[0...5]) // ==> "Hello,"
    println(s[0..<5]) // ==> "Hello"

为了好玩,您还可以+在索引上添加运算符:


func +<T: ForwardIndex>(var index: T, var count: Int) -> T {

  for (; count > 0; --count) {

    index = index.succ()

  }

  return index

}


s.substringWithRange(s.startIndex+2 .. s.startIndex+5)

(我还不知道这个是否应该成为该语言的一部分。)


查看完整回答
反对 回复 2019-07-31
  • 3 回答
  • 0 关注
  • 1030 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信