我想从字符串中删除第一个字符。到目前为止,我想出的最简洁的事情是:
display.text = display.text!.substringFromIndex(advance(display.text!.startIndex, 1))
我知道,由于Unicode的存在,我们不能用Int
索引字符串,但是这个解决方案看起来非常冗长。还有别的方法可以让我俯瞰吗?
发布于 2015-02-11 03:31:58
如果您使用的是Swift 3,您可以忽略这个答案的第二部分。好消息是,这现在又是简洁了!只需使用String的新remove(at:)方法。
var myString = "Hello, World"
myString.remove(at: myString.startIndex)
myString // "ello, World"
我喜欢这个全局dropFirst()
函数。
let original = "Hello" // Hello
let sliced = dropFirst(original) // ello
它很短,很清楚,并且适用于任何符合切片协议的东西。
如果您使用Swift 2,这个答案已经改变了。您仍然可以使用dropFirst,但必须删除字符串characters
属性中的第一个字符,然后将结果转换回字符串。dropFirst也已成为一种方法,而不是一种函数。
let original = "Hello" // Hello
let sliced = String(original.characters.dropFirst()) // ello
另一种选择是使用后缀函数来拼接字符串的UTF16View
。当然,之后还必须将其转换回字符串。
let original = "Hello" // Hello
let sliced = String(suffix(original.utf16, original.utf16.count - 1)) // ello
这一切都是说,我最初提供的解决方案在Swift的新版本中并不是最简洁的方法。如果您正在寻找一个简短的、直观的解决方案,我建议您回到使用removeAtIndex()
的@chris解决方案上。
var original = "Hello" // Hello
let removedChar = original.removeAtIndex(original.startIndex)
original // ello
正如@vacawama在下面的注释中指出的那样,另一个不修改原始字符串的选项是使用substringFromIndex。
let original = "Hello" // Hello
let substring = original.substringFromIndex(advance(original.startIndex, 1)) // ello
或者,如果您碰巧希望从字符串的开头和结尾删除一个字符,则可以使用substringWithRange。只需确保在startIndex + n > endIndex - m
时防止出现这种情况。
let original = "Hello" // Hello
let newStartIndex = advance(original.startIndex, 1)
let newEndIndex = advance(original.endIndex, -1)
let substring = original.substringWithRange(newStartIndex..<newEndIndex) // ell
最后一行也可以使用下标表示法编写。
let substring = original[newStartIndex..<newEndIndex]
发布于 2015-06-14 13:34:21
Swift 4的更新
在Swift 4中,String
再次符合Collection
,因此可以使用dropFirst
和dropLast
来修剪字符串的开头和结尾。结果是Substring
类型,因此您需要将其传递给String
构造函数以获得一个String
。
let str = "hello"
let result1 = String(str.dropFirst()) // "ello"
let result2 = String(str.dropLast()) // "hell"
dropFirst()
和dropLast()
还使用Int
来指定要删除的字符数:
let result3 = String(str.dropLast(3)) // "he"
let result4 = String(str.dropFirst(4)) // "o"
如果指定要删除的字符比字符串中的字符多,则结果将是空字符串(""
)。
let result5 = String(str.dropFirst(10)) // ""
Swift 3的更新
如果您只想删除第一个字符并想要更改原来的字符串,那么请参阅@MickMacCallum的答案。如果要在进程中创建新字符串,请使用substring(from:)
。通过对String
的扩展,您可以隐藏substring(from:)
和substring(to:)
的丑陋,从而创建有用的添加来修剪String
的开始和结束
extension String {
func chopPrefix(_ count: Int = 1) -> String {
return substring(from: index(startIndex, offsetBy: count))
}
func chopSuffix(_ count: Int = 1) -> String {
return substring(to: index(endIndex, offsetBy: -count))
}
}
"hello".chopPrefix() // "ello"
"hello".chopPrefix(3) // "lo"
"hello".chopSuffix() // "hell"
"hello".chopSuffix(3) // "he"
就像前面的dropFirst
和dropLast
一样,如果字符串中没有足够的字母,这些函数就会崩溃。呼叫者有责任正确地使用它们。这是一个有效的设计决策。您可以编写它们以返回一个可选的选项,然后调用方必须展开该选项。
Swift 2.x
唉,在Swift 2中,dropFirst
和dropLast
(以前最好的解决方案)已经不像以前那么方便了。通过对String
的扩展,您可以隐藏substringFromIndex
和substringToIndex
的丑陋
extension String {
func chopPrefix(count: Int = 1) -> String {
return self.substringFromIndex(advance(self.startIndex, count))
}
func chopSuffix(count: Int = 1) -> String {
return self.substringToIndex(advance(self.endIndex, -count))
}
}
"hello".chopPrefix() // "ello"
"hello".chopPrefix(3) // "lo"
"hello".chopSuffix() // "hell"
"hello".chopSuffix(3) // "he"
就像前面的dropFirst
和dropLast
一样,如果字符串中没有足够的字母,这些函数就会崩溃。呼叫者有责任正确地使用它们。这是一个有效的设计决策。您可以编写它们以返回一个可选的选项,然后调用方必须展开该选项。
在SWIFT1.2中,您需要像这样调用chopPrefix
:
"hello".chopPrefix(count: 3) // "lo"
也可以向函数定义中添加下划线_
,以抑制参数名:
extension String {
func chopPrefix(_ count: Int = 1) -> String {
return self.substringFromIndex(advance(self.startIndex, count))
}
func chopSuffix(_ count: Int = 1) -> String {
return self.substringToIndex(advance(self.endIndex, -count))
}
}
发布于 2016-06-14 10:20:00
Swift 2.2
“前进”不可用:调用索引的'advancedBy(n)‘方法
func chopPrefix(count: Int = 1) -> String {
return self.substringFromIndex(self.startIndex.advancedBy(count))
}
func chopSuffix(count: Int = 1) -> String {
return self.substringFromIndex(self.endIndex.advancedBy(count))
}
Swift 3.0
func chopPrefix(_ count: Int = 1) -> String {
return self.substring(from: self.characters.index(self.startIndex, offsetBy: count))
}
func chopSuffix(_ count: Int = 1) -> String {
return self.substring(to: self.characters.index(self.endIndex, offsetBy: -count))
}
Swift 3.2
字符串内容的视图,作为字符的集合。 @available(迅速,不推荐: 3.2,消息:“请直接使用字符串或子字符串”)公共变量字符: String.CharacterView
func chopPrefix(_ count: Int = 1) -> String {
if count >= 0 && count <= self.count {
return self.substring(from: String.Index(encodedOffset: count))
}
return ""
}
func chopSuffix(_ count: Int = 1) -> String {
if count >= 0 && count <= self.count {
return self.substring(to: String.Index(encodedOffset: self.count - count))
}
return ""
}
Swift 4
extension String {
func chopPrefix(_ count: Int = 1) -> String {
if count >= 0 && count <= self.count {
let indexStartOfText = self.index(self.startIndex, offsetBy: count)
return String(self[indexStartOfText...])
}
return ""
}
func chopSuffix(_ count: Int = 1) -> String {
if count >= 0 && count <= self.count {
let indexEndOfText = self.index(self.endIndex, offsetBy: -count)
return String(self[..<indexEndOfText])
}
return ""
}
}
https://stackoverflow.com/questions/28445917
复制相似问题