如何剪切字符串的最后一个字符并将其快速保存为变量?

时间:2020-09-15 11:56:13

标签: swift string

我有一个字符串test@me

现在我想创建一个代码,让我可以剪裁@的位置并将其保存为变量,因此预期结果为string1 = test string2 = @me

代码将是这样

func test(string: String) {
    var mString = string
    var cuttedString = mString.cutFrom("@")
    
    print(mString)
    print(cuttedString)
}

test(string: "test@me")

结果:

test
@me

5 个答案:

答案 0 :(得分:2)

结合使用suffix(from:)firstIndex(of:)

let string = "test@me"

let last = string.suffix(from: string.firstIndex(of: "@") ?? string.startIndex)

请注意,如果未找到“ @”,它将返回完整的字符串,您可以通过将string.startIndex替换为string.endIndex来返回空字符串


将字符串分为两部分,即“ test”和“ @me”

var first: String = ""
var last: String = ""
if let index = string.firstIndex(of: "@") {
    last = String(string.suffix(from: index))
    first = String(string.prefix(upTo: index))
}

print(first, last)

答案 1 :(得分:2)

这里是extension中的String,可以执行您想要的功能。它需要一个String并通过删除该部分上的所有内容来对调用方String进行突变,然后返回被删除的部分。

import Foundation

extension String {
    mutating func cut(from string: String) -> String {
        if let range = self.range(of: string) {
            let cutPart = String(self[range.lowerBound...])
            self.removeSubrange(range.lowerBound...)
            return cutPart
        }
        else {
            return ""
        }
    }
}

func test(string: String) {
    var mString = string
    let cutString = mString.cut(from: "@")
    
    print(mString)
    print(cutString)
}

test(string: "test@me")
test
@me

通用的 实现

这是@LeoDabus在评论中建议的通用实现:

extension StringProtocol where Self: RangeReplaceableCollection {
    @discardableResult mutating func removeSubrange<S: StringProtocol>(from string: S) -> SubSequence {
        guard let range = range(of: string) else { return "" }
        defer { removeSubrange(range.lowerBound...) }
        return self[range.lowerBound...]
    }
}

很好地展示了:

  1. 扩展协议而不是String,以允许该功能与其他类型(例如String.Subsequence)一起使用。
  2. 使用@discardableResult可以调用该函数以缩短String,而无需使用返回的子字符串。
  3. 使用guard let语句解开range(of:)的可选返回值,并在范围为nil的情况下提早退出。
  4. 使用defer延迟删除子字符串,直到返回子字符串为止,这避免了使用局部变量。

答案 2 :(得分:0)

您可以为此使用-platform offscreen下标:

String

答案 3 :(得分:0)

func test(string: String) {
    let mString = string.prefix { $0 != "@" }
    let cuttedString = string.suffix(from: string.firstIndex(of: "@") ?? string.startIndex)
    
    print(mString)
    print(cuttedString)
}

test(string: "test@me")
// prints test
//        @me

但是请记住,mStringcuttedString不是String而是Substring,所以请注意正确的用法。

答案 4 :(得分:0)

有多种方法可以做到这一点。

您可以使用components(separatedBy:)将字符串分成多个部分,然后在最后一个末尾添加一个@

extension String {
    func cutFrom(_ divider: Character) -> String {
        let array = components(separatedBy: String(divider))
        //For an Optional, `map()` returns nil if the optional is empty, 
        //Or the result of applying the closure to the unwrapped contents if not
        return array.last.map {String(divider) + $0} ?? ""
    }
}

或者,您可以使用firstIndex查找字符串中第一个分隔符的索引,然后从该索引返回一个子字符串到结尾:

extension String {
    func cutFrom(_ divider: Character) -> String {
        //For an Optional, `map()` returns nil if the optional is empty, 
        //Or the result of applying the closure to the unwrapped contents if not
        return firstIndex(of: divider).map { String(self[$0..<endIndex])} ?? ""
    }
}

同时使用两个版本的函数返回Optionals并返回NIL(如果找不到分隔符)可能会更干净。您还可能需要调整逻辑以处理分隔符出现多次的字符串。