首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Swift中,从字符串中删除第一个字符的最简洁的方法是什么?

在Swift中,从字符串中删除第一个字符的最简洁的方法是什么?
EN

Stack Overflow用户
提问于 2015-02-11 03:07:24
回答 13查看 118.5K关注 0票数 152

我想从字符串中删除第一个字符。到目前为止,我想出的最简洁的事情是:

代码语言:javascript
运行
复制
display.text = display.text!.substringFromIndex(advance(display.text!.startIndex, 1))

我知道,由于Unicode的存在,我们不能用Int索引字符串,但是这个解决方案看起来非常冗长。还有别的方法可以让我俯瞰吗?

EN

回答 13

Stack Overflow用户

回答已采纳

发布于 2015-02-11 03:31:58

如果您使用的是Swift 3,您可以忽略这个答案的第二部分。好消息是,这现在又是简洁了!只需使用String的新remove(at:)方法。

代码语言:javascript
运行
复制
var myString = "Hello, World"
myString.remove(at: myString.startIndex)

myString // "ello, World"

我喜欢这个全局dropFirst()函数。

代码语言:javascript
运行
复制
let original = "Hello" // Hello
let sliced = dropFirst(original) // ello

它很短,很清楚,并且适用于任何符合切片协议的东西。

如果您使用Swift 2,这个答案已经改变了。您仍然可以使用dropFirst,但必须删除字符串characters属性中的第一个字符,然后将结果转换回字符串。dropFirst也已成为一种方法,而不是一种函数。

代码语言:javascript
运行
复制
let original = "Hello" // Hello
let sliced = String(original.characters.dropFirst()) // ello

另一种选择是使用后缀函数来拼接字符串的UTF16View。当然,之后还必须将其转换回字符串。

代码语言:javascript
运行
复制
let original = "Hello" // Hello
let sliced = String(suffix(original.utf16, original.utf16.count - 1)) // ello

这一切都是说,我最初提供的解决方案在Swift的新版本中并不是最简洁的方法。如果您正在寻找一个简短的、直观的解决方案,我建议您回到使用removeAtIndex()的@chris解决方案上。

代码语言:javascript
运行
复制
var original = "Hello" // Hello
let removedChar = original.removeAtIndex(original.startIndex)

original // ello

正如@vacawama在下面的注释中指出的那样,另一个不修改原始字符串的选项是使用substringFromIndex。

代码语言:javascript
运行
复制
let original = "Hello" // Hello
let substring = original.substringFromIndex(advance(original.startIndex, 1)) // ello

或者,如果您碰巧希望从字符串的开头和结尾删除一个字符,则可以使用substringWithRange。只需确保在startIndex + n > endIndex - m时防止出现这种情况。

代码语言:javascript
运行
复制
let original = "Hello" // Hello

let newStartIndex = advance(original.startIndex, 1)
let newEndIndex = advance(original.endIndex, -1)

let substring = original.substringWithRange(newStartIndex..<newEndIndex) // ell

最后一行也可以使用下标表示法编写。

代码语言:javascript
运行
复制
let substring = original[newStartIndex..<newEndIndex]
票数 249
EN

Stack Overflow用户

发布于 2015-06-14 13:34:21

Swift 4的更新

在Swift 4中,String再次符合Collection,因此可以使用dropFirstdropLast来修剪字符串的开头和结尾。结果是Substring类型,因此您需要将其传递给String构造函数以获得一个String

代码语言:javascript
运行
复制
let str = "hello"
let result1 = String(str.dropFirst())    // "ello"
let result2 = String(str.dropLast())     // "hell"

dropFirst()dropLast()还使用Int来指定要删除的字符数:

代码语言:javascript
运行
复制
let result3 = String(str.dropLast(3))    // "he"
let result4 = String(str.dropFirst(4))   // "o"

如果指定要删除的字符比字符串中的字符多,则结果将是空字符串("")。

代码语言:javascript
运行
复制
let result5 = String(str.dropFirst(10))  // ""

Swift 3的更新

如果您只想删除第一个字符并想要更改原来的字符串,那么请参阅@MickMacCallum的答案。如果要在进程中创建新字符串,请使用substring(from:)。通过对String的扩展,您可以隐藏substring(from:)substring(to:)的丑陋,从而创建有用的添加来修剪String的开始和结束

代码语言:javascript
运行
复制
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"

就像前面的dropFirstdropLast一样,如果字符串中没有足够的字母,这些函数就会崩溃。呼叫者有责任正确地使用它们。这是一个有效的设计决策。您可以编写它们以返回一个可选的选项,然后调用方必须展开该选项。

Swift 2.x

唉,在Swift 2中,dropFirstdropLast (以前最好的解决方案)已经不像以前那么方便了。通过对String的扩展,您可以隐藏substringFromIndexsubstringToIndex的丑陋

代码语言:javascript
运行
复制
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"

就像前面的dropFirstdropLast一样,如果字符串中没有足够的字母,这些函数就会崩溃。呼叫者有责任正确地使用它们。这是一个有效的设计决策。您可以编写它们以返回一个可选的选项,然后调用方必须展开该选项。

SWIFT1.2中,您需要像这样调用chopPrefix

代码语言:javascript
运行
复制
"hello".chopPrefix(count: 3)  // "lo"

也可以向函数定义中添加下划线_,以抑制参数名:

代码语言:javascript
运行
复制
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))
    }
}
票数 150
EN

Stack Overflow用户

发布于 2016-06-14 10:20:00

Swift 2.2

“前进”不可用:调用索引的'advancedBy(n)‘方法

代码语言:javascript
运行
复制
    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

代码语言:javascript
运行
复制
    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

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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 ""
    }
}
票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28445917

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档