在 Swift 4 中如何获取子字符串?

4
我知道在Swift 4中可以使用下标来截取字符串。
let s = "aString"
let subS = s[..<s.endIndex]

但问题是如何将s截取成类似于aStr的子串。
我的意思是,我想做的事情类似于s[..<(s.endIndex-3)]
但这样是不正确的。
那么,在Swift 4中该怎么做呢?


这有什么问题吗? - dahiya_boy
在这种情况下,您可以简单地调用 let subS = String(s.dropLast(3)) - Martin R
使用 dropLast 时,您将无法提取内部范围,例如:Stri - mugx
1
@JsW https://dev59.com/wGAf5IYBdhLWcg3w9mts#38215613 - Leo Dabus
1
请移步以下链接查看关于Swift 3.0中如何删除字符串末尾两个字符的问题:https://dev59.com/6FkS5IYBdhLWcg3wVlPC#40028338 - Leo Dabus
显示剩余3条评论
3个回答

17

String.Index 不是整数,你不能简单地做减法 s.endIndex - 3,因为“集合移动它们的索引”,可参考Swift进化中的 一种新的集合和索引模型

必须小心,不要将索引移动到有效范围之外。例如:

let s = "aString"

if let upperBound = s.index(s.endIndex, offsetBy: -3, limitedBy: s.startIndex) {
    let subS = String(s[..<upperBound])
} else {
    print("too short")
}

或者说,

let upperBound = s.index(s.endIndex, offsetBy: -3, limitedBy: s.startIndex) ?? s.startIndex
let subS = String(s[..<upperBound])

如果s少于3个字符,那么将打印一个空字符串。

如果你想要一个字符串的初始部分,那么可以简单地执行以下操作:

let subS = String(s.dropLast(3))

或作为一种变异方法:

var s = "aString"
s.removeLast(min(s.count, 3))
print(s) // "aStr"

2

你说的错误是二元运算符“-”不能应用于类型为“String.Index”和“Int”的操作数

您需要先找到Swift.Index

let s = "aString"
let index = s.index(s.endIndex, offsetBy: -3)
let subS = s[..<index]
print(String(subS))

1
如果原始字符串少于3个字符,这将导致崩溃。最好使用Martin提出的dropLast。 - Leo Dabus

2
我只需要一个简单的子字符串,从x个字符的开头开始。以下是一个函数。
翻译后的内容:

我只需要一个简单的子字符串,从x个字符的开头开始。以下是一个函数。

func SimpleSubstring(string : String, length : Int) -> String {
    var returnString = string

    if (string.count > length) {
        returnString = String(string[...string.index(string.startIndex, offsetBy: length - 1)])
    }

    return returnString
}

usage

let myTruncatedString : String = SimpleSubstring(string: myBigString, length: 10)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接