Ios Swift:如何在某个字符之前获取字符串?

Ios Swift:如何在某个字符之前获取字符串?,ios,swift,Ios,Swift,如何获取swift中某个字符前面的字符串?下面的代码是我在Objective C中如何完成的,但在Swift中似乎无法执行相同的任务。关于如何做到这一点,有什么建议吗rangeOfString在swift中似乎根本不起作用(尽管swift又在替我做事) 正如您从上面的代码中看到的,我能够在Objective C中获得空格字符之前的字符串 编辑:如果我尝试这样的事情 var string = "hello Swift" var range : NSRange = string.rangeOfS

如何获取swift中某个字符前面的字符串?下面的代码是我在Objective C中如何完成的,但在Swift中似乎无法执行相同的任务。关于如何做到这一点,有什么建议吗
rangeOfString
在swift中似乎根本不起作用(尽管swift又在替我做事)

正如您从上面的代码中看到的,我能够在Objective C中获得空格字符之前的字符串

编辑:如果我尝试这样的事情

 var string = "hello Swift"
 var range : NSRange = string.rangeOfString("Swift")
我得到以下错误

无法将表达式的类型“NSString”转换为类型“(String, 选项:NSStringCompareOptions,范围:range?,区域设置: NSLocale?'


不确定我到底做错了什么或如何正确解决它。

使用componentsSeparatedByString(),如下所示:

var delimiter = " "
var newstr = "token0 token1 token2 token3"
var token = newstr.components(separatedBy: delimiter)
print (token[0])
或者使用您的特定案例:

var delimiter = " token1"
var newstr = "token0 token1 token2 token3"
var token = newstr.components(separatedBy: delimiter)
print (token[0])

您可以对
String
类提供的
rangeOfString()
执行相同的操作

let string = "Hello Swift"
if let range = string.rangeOfString("Swift") {
   let firstPart = string[string.startIndex..<range.startIndex]
   print(firstPart) // print Hello
}
Swift 3更新:

let string = "Hello Swift"
if let range = string.range(of: "Swift") {
    let firstPart = string[string.startIndex..<range.lowerBound]
    print(firstPart) // print Hello
}
let string=“你好,斯威夫特”
如果let range=string.range(of:“Swift”){

让FrestPosie= String [String,StistCaldial.< P>。如果您想要一个不涉及拖动基础的解决方案,您可以使用<代码>查找< /COD>和切片:

let str = "Hello, I must be going."

if let comma = find(str, ",") {
    let substr = str[str.startIndex..<comma]
    // substr will be "Hello"
}
let str=“你好,我得走了。”
如果让逗号=查找(str,“,”){

让substr=str[str.startIndex..可以使用
rangeOfString
,但它返回的是
范围
类型,而不是
NSRange

let string = "hello Swift"
if let range = string.rangeOfString("Swift") {
    print(string.substringToIndex(range.startIndex))
}

要将字符串变为零件,直到指定字符串第一次出现,可以如下扩展字符串:

extension String {

    mutating func until(_ string: String) {
        let components = self.components(separatedBy: string)
        self = components[0]
    }

}
这可以这样称呼:

var foo = "Hello Swift"
foo.until(" Swift") // foo is now "Hello"
我的2美分:-)使用Swift 3.0,类似于PHP
strstr

extension String {

    func strstr(needle: String, beforeNeedle: Bool = false) -> String? {
        guard let range = self.range(of: needle) else { return nil }

        if beforeNeedle {
            return self.substring(to: range.lowerBound)
        }

        return self.substring(from: range.upperBound)
    }

}
用法1

"Hello, World!".strstr(needle: ",", beforeNeedle: true) // returns Hello
用法2

"Hello, World!".strstr(needle: " ") // returns World!

接下来是Syed Tariq的回答:如果您只希望字符串位于分隔符之前(否则,您将收到一个数组[string]):

let string=“你好,世界”
如果let range=string.range(of:“-”){

让firstPart=string[(string.startIndex)…下面是一个完整的组合

let string = "This a string split using * and this is left."
if let range = string.range(of: "*") {
    let lastPartIncludingDelimiter = string.substring(from: range.lowerBound)
    print(lastPartIncludingDelimiter) // print * and this is left.

    let lastPartExcludingDelimiter = string.substring(from: range.upperBound)
    print(lastPartExcludingDelimiter) // print and this is left.

    let firstPartIncludingDelimiter = string.substring(to: range.upperBound)
    print(firstPartIncludingDelimiter) // print This a string split using *

    let firstPartExcludingDelimiter = string.substring(to: range.lowerBound)
    print(firstPartExcludingDelimiter) // print This a string split using
}
您可以使用Swift 4或更高版本中的方法

var string = "hello Swift"
if let index = string.firstIndex(of: " ") {
    let firstPart = string.prefix(upTo: index)
    print(firstPart) // print hello
}

Swift 5扩展版

extension String {
    func stringBefore(_ delimiter: Character) -> String {
        if let index = firstIndex(of: delimiter) {
            return String(prefix(upTo: index))
        } else {
            return ""
        }
    }
    
    func stringAfter(_ delimiter: Character) -> String {
        if let index = firstIndex(of: delimiter) {
            return String(suffix(from: index).dropFirst())
        } else {
            return ""
        }
    }
}

let str = "n1:lolz"
print(str.stringBefore(":")) // n1
print(str.stringAfter(":")) // lolz

let str = "n1:"
print(str.stringBefore(":")) // n1
print(str.stringAfter(":")) // empty string

let str = "n1+lolz"
print(str.stringBefore(":")) // empty string
print(str.stringAfter(":")) // empty string

这应该根据您的需要和边缘情况进行微调。

在Swift中,他们也使用了rangeOfString,而且似乎很有效。我编辑了我的问题,以便更好地解释在尝试应用您的解决方案时发生的情况。您可以使用
Range
而不是
NSRange
让Range:Range?=string.rangeOfString(“Swift”)
。您也可以将
String
强制转换为
NSString
var range:NSRange=(字符串为NSString)。rangeOfString(“Swift”)
是的……它可以工作……但如果我想在某个字符之后获取字符串呢?@Bhavin
查找(str,”)。successiver()
@all
find
在Swift 2.0奇妙的答案中不再受支持。我试图找出如何使用rangeOfString来完成此任务,但这要高效得多。
var token = newstr.components(separatedBy: delimiter).first
let string = "Hello-world"
if let range = string.range(of: "-") {
let firstPart = string[(string.startIndex)..<range.lowerBound]
 print(firstPart) 
}
let string = "This a string split using * and this is left."
if let range = string.range(of: "*") {
    let lastPartIncludingDelimiter = string.substring(from: range.lowerBound)
    print(lastPartIncludingDelimiter) // print * and this is left.

    let lastPartExcludingDelimiter = string.substring(from: range.upperBound)
    print(lastPartExcludingDelimiter) // print and this is left.

    let firstPartIncludingDelimiter = string.substring(to: range.upperBound)
    print(firstPartIncludingDelimiter) // print This a string split using *

    let firstPartExcludingDelimiter = string.substring(to: range.lowerBound)
    print(firstPartExcludingDelimiter) // print This a string split using
}
var string = "hello Swift"
if let index = string.firstIndex(of: " ") {
    let firstPart = string.prefix(upTo: index)
    print(firstPart) // print hello
}
extension String {
    func stringBefore(_ delimiter: Character) -> String {
        if let index = firstIndex(of: delimiter) {
            return String(prefix(upTo: index))
        } else {
            return ""
        }
    }
    
    func stringAfter(_ delimiter: Character) -> String {
        if let index = firstIndex(of: delimiter) {
            return String(suffix(from: index).dropFirst())
        } else {
            return ""
        }
    }
}

let str = "n1:lolz"
print(str.stringBefore(":")) // n1
print(str.stringAfter(":")) // lolz

let str = "n1:"
print(str.stringBefore(":")) // n1
print(str.stringAfter(":")) // empty string

let str = "n1+lolz"
print(str.stringBefore(":")) // empty string
print(str.stringAfter(":")) // empty string