【问题标题】:How to get substring with specific ranges in Swift 4?如何在 Swift 4 中获取具有特定范围的子字符串?
【发布时间】:2018-03-07 04:27:41
【问题描述】:

这是使用官方 Swift4 文档中的示例代码

let greeting = "Hi there! It's nice to meet you! ????"
let endOfSentence = greeting.index(of: "!")!
let firstSentence = greeting[...endOfSentence]
// firstSentence == "Hi there!"

但是让我们说let greeting = "Hello there world!" 我想只检索这句话中的第二个单词(子字符串)?所以我只想要“那里”这个词。

我尝试过使用“世界!”作为一个论点 let endOfSentence = greeting.index(of: "world!")! 但 Swift 4 Playground 不喜欢这样。它期待 'Character' 而我的论点是一个字符串。

那么我怎样才能得到一个非常精确的子范围的子字符串呢?或者在一个句子中获取第 n 个单词以供将来更多地使用?

【问题讨论】:

    标签: swift substring swift4


    【解决方案1】:

    您可以使用range(of:) 搜索子字符串。

    import Foundation
    
    let greeting = "Hello there world!"
    
    if let endIndex = greeting.range(of: "world!")?.lowerBound {
        print(greeting[..<endIndex])
    }
    

    输出:

    Hello there 
    

    编辑:

    如果你想把单词分开,有一个又快又脏的方法和一个好方法。快速而肮脏的方式:

    import Foundation
    
    let greeting = "Hello there world!"
    
    let words = greeting.split(separator: " ")
    
    print(words[1])
    

    这是彻底的方法,它将枚举字符串中的所有单词,无论它们如何分隔:

    import Foundation
    
    let greeting = "Hello there world!"
    
    var words: [String] = []
    
    greeting.enumerateSubstrings(in: greeting.startIndex..<greeting.endIndex, options: .byWords) { substring, _, _, _ in
        if let substring = substring {
            words.append(substring)
        }
    }
    
    print(words[1])
    

    编辑 2:如果您只是想获得第 7 到第 11 个字符,您可以这样做:

    import Foundation
    
    let greeting = "Hello there world!"
    
    let startIndex = greeting.index(greeting.startIndex, offsetBy: 6)
    let endIndex = greeting.index(startIndex, offsetBy: 5)
    
    print(greeting[startIndex..<endIndex])
    

    【讨论】:

    • 对不起,我应该更清楚。我想要的正是“那里”这个词。在 Java 背景中,我只需将字符串推入字符串数组并从索引 7 到 11 打印。在 Swift4 中是否没有使用子字符串成员的内置方法?
    • @KentW 试穿尺寸。
    • 谢谢!我不想导入基础。彻底的回答。我在 Swift 4 iBook 中找不到这个。
    • 我只是想知道是什么让 swift 与其他语言相比如此复杂的子字符串。
    【解决方案2】:

    旧习惯很难改掉。我用“Java”的方式做,用空格分割字符串,然后访问第二个单词。

    print(greeting.split(separator: " ")[1]) // "there /n"
    

    【讨论】:

      【解决方案3】:

      对于 swift4,

      let string = "substring test"
      let start = String.Index(encodedOffset: 0)
      let end = String.Index(encodedOffset: 10)
      let substring = String(string[start..<end])
      

      【讨论】:

      • 请注意,如果字符串包含需要多个 UTF-16 代码单元的字符(如表情符号),String.Index(encodedOffset:) 可能会得到与您预期不同的内容。
      • encodedOffset 的使用是considered harmful,将是deprecated
      【解决方案4】:

      第一个答案有一个错误。

      Range<String.Index>.upperBound
      

      upperBound 属性应该是 endIndex 例如:

      let text = "From Here Hello World"
      if let result = text.range(of: "Hello World") {
           let startIndex = result.upperBound
           let endIndex = result.lowerBound
           print(String(text[startIndex..<endIndex])) //"Hello World"
      }
      

      【讨论】:

        【解决方案5】:

        在 Swift 5 中,codedOffset (swift 4 func) 已被弃用。
        您需要使用utf160Offset

        // Swift 5     
        
        let string = "Hi there! It's nice to meet you!"
        let startIndex = 10 // random for this example
        let endIndex = string.count
        
        let start = String.Index(utf16Offset: startIndex, in: string)
        let end = String.Index(utf16Offset: endIndex, in: string)
        
        let substring = String(string[start..<end])
        

        prints -> 很高兴认识你!

        【讨论】:

          【解决方案6】:

          我使用的最简单的方法是:

          var str = "abcdefg"
          String(Array(str)[2...4])
          

          【讨论】:

          • 正是我在用例中寻找的东西,谢谢!
          猜你喜欢
          • 2021-03-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-08-20
          • 2017-03-12
          • 2023-04-05
          • 2011-05-13
          相关资源
          最近更新 更多