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

Dan*_*ger 42 ios swift

如何在swift中的某个字符前获取字符串?下面的代码是我在Objective C中的表现,但似乎无法在Swift中执行相同的任务.有关如何实现这一目标的任何提示或建议?rangeOfString似乎在swift中根本不起作用(尽管Swift一直在为我做准备).

NSRange range = [time rangeOfString:@" "];
NSString *startDate =
[time substringToIndex:range.location];
Run Code Online (Sandbox Code Playgroud)

从上面的代码中可以看出,我能够在Objective C中的空格字符之前获取字符串.

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

 var string = "hello Swift"
 var range : NSRange = string.rangeOfString("Swift")
Run Code Online (Sandbox Code Playgroud)

我收到以下错误.

无法将表达式的类型'NSString'转换为''(String,options:NSStringCompareOptions,range:Range?,locale:NSLocale?)'

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

Sye*_*riq 98

使用componentsSeparatedByString()如下所示:

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

或者使用您的具体案例:

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


Kev*_*ado 25

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

let string = "Hello Swift"
if let range = string.rangeOfString("Swift") {
   let firstPart = string[string.startIndex..<range.startIndex]
   print(firstPart) // print Hello
}
Run Code Online (Sandbox Code Playgroud)

您也可以使用您的方法实现它substringToIndex()

let string = "Hello Swift"
if let range = string.rangeOfString("Swift") {
   firstPart = string.substringToIndex(range.startIndex)
   print(firstPart) // print Hello
}
Run Code Online (Sandbox Code Playgroud)

Swift 3更新:

let string = "Hello Swift"
if let range = string.range(of: "Swift") {
    let firstPart = string[string.startIndex..<range.lowerBound]
    print(firstPart) // print Hello
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮到你 ;)


Mic*_*ang 10

您可以在Swift 4 或更高版本中使用方法prefix(upTo:)

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


小智 9

跟进Syed Tariq的回答:如果你只想在分隔符之前使用字符串(否则,你收到一个数组[String]):

var token = newstr.components(separatedBy: delimiter).first
Run Code Online (Sandbox Code Playgroud)


bso*_*sod 6

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
Run Code Online (Sandbox Code Playgroud)

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


Aam*_*irR 5

我的 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)
    }

}
Run Code Online (Sandbox Code Playgroud)

用法1

"Hello, World!".strstr(needle: ",", beforeNeedle: true) // returns Hello
Run Code Online (Sandbox Code Playgroud)

用法2

"Hello, World!".strstr(needle: " ") // returns World!
Run Code Online (Sandbox Code Playgroud)