我有一个字符串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
答案 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...]
}
}
很好地展示了:
String
,以允许该功能与其他类型(例如String.Subsequence
)一起使用。@discardableResult
可以调用该函数以缩短String
,而无需使用返回的子字符串。guard let
语句解开range(of:)
的可选返回值,并在范围为nil
的情况下提早退出。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
但是请记住,mString
和cuttedString
不是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(如果找不到分隔符)可能会更干净。您还可能需要调整逻辑以处理分隔符出现多次的字符串。