首页 文章

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

提问于
浏览
36

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

NSRange range = [time rangeOfString:@" "];
NSString *startDate =
[time substringToIndex:range.location];

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

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

var string = "hello Swift"
 var range : NSRange = string.rangeOfString("Swift")

我收到以下错误 .

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

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

9 回答

  • 1
    let string = "Hello-world"
    if let range = string.range(of: "-") {
    let firstPart = string[(string.startIndex)..<range.lowerBound]
     print(firstPart) 
    }
    

    Output is: Hello

  • 1

    下面是一个整体组合

    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
    }
    
  • 7

    使用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])
    
  • 3

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

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

    You can also 用你的方法实现它 substringToIndex()

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

    Swift 3 UPDATE:

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

    希望这可以帮到你 ;)

  • 1

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

    var token = newstr.components(separatedBy: delimiter).first
    
  • 83

    如果你想要一个不涉及基础的解决方案,你可以使用 find 并切片:

    let str = "Hello, I must be going."
    
    if let comma = find(str, ",") {
        let substr = str[str.startIndex..<comma]
        // substr will be "Hello"
    }
    

    如果在没有找到这样的字符的情况下显式想要一个空字符串,则可以使用nil-coalescing运算符:

    let str = "no comma"
    let comma = find(str, ",") ?? str.startIndex
    let substr = str[str.startIndex..<comma]  // substr will be ""
    

    注意,与 componentsSeparatedByString 技术不同,这不需要创建数组,只需要扫描到第一次出现的字符,而不是将整个字符串分解为字符分隔的数组 .

  • 20

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

    Usage1

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

    Usage2

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

    要将String变为部分直到第一次出现指定的String,您可以像这样扩展String:

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

    这可以这样调用:

    var foo = "Hello Swift"
    foo.until(" Swift") // foo is now "Hello"
    
  • 2

    您可以使用 rangeOfString ,但它返回 Range<String.Index> 类型,而不是 NSRange

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

相关问题