如何从Swift中的字符串返回第一个单词?

Sty*_*yx1 7 string swift swift-playground

例如,如果我们有这样的情况:

 var myString = "Today was a good day"
Run Code Online (Sandbox Code Playgroud)

返回第一个单词的最佳方法是什么,即"今天"?我认为应该应用映射,但不确定如何.

谢谢.

win*_*int 14

我能想到的最简单的方法是

斯威夫特3

let string = "hello world"
let firstWord = string.components(separatedBy: " ").first
Run Code Online (Sandbox Code Playgroud)

Swift 2.2

let string = "hello world"
let firstWord = string.componentsSeparatedByString(" ").first
Run Code Online (Sandbox Code Playgroud)

如果您认为需要在代码中使用它,请将其作为一个 extension

extension String {
    func firstWord() -> String? {
        return self.components(separatedBy: " ").first
    }
}
Run Code Online (Sandbox Code Playgroud)

用法

let string = "hello world"
let firstWord = string.firstWord()
Run Code Online (Sandbox Code Playgroud)

  • 根据字符串,这可能太天真了.例如,"你好,世界!" 会产生"你好",这可能是也可能不是你想要的.也许试试```let separator =",.;:*?"/*word boundary*/let components = self.components(separatedBy:CharacterSet.init(charactersIn:separator))让firstWord = components.first```? (3认同)

Leo*_*bus 7

您可以使用String Method enumerateSubstrings和options enumerateSubstrings(in: Range<String.Index>)来枚举字符串中的单词,只需获取第一个元素:

Swift 4.2

import Foundation

extension StringProtocol {

    var byLines: [SubSequence] { components(separated: .byLines) }
    var byWords: [SubSequence] { components(separated: .byWords) }

    func components(separated options: String.EnumerationOptions)-> [SubSequence] {
        var components: [SubSequence] = []
        enumerateSubstrings(in: startIndex..., options: options) { _, range, _, _ in components.append(self[range]) }
        return components
    }

    var firstWord: SubSequence? {
        var word: SubSequence?
        enumerateSubstrings(in: startIndex..., options: .byWords) { _, range, _, stop in
            word = self[range]
            stop = true
        }
        return word
    }
    var firstLine: SubSequence? {
        var line: SubSequence?
        enumerateSubstrings(in: startIndex..., options: .byLines) { _, range, _, stop in
            line = self[range]
            stop = true
        }
        return line
    }
}
Run Code Online (Sandbox Code Playgroud)

游乐场测试:

let string = "• Today was a good day.\n• Tomorrow will be better.\n"

let firstWord = string.firstWord                               // "Today"
let firstLine = string.firstLine                               // "• Today was a good day."
let firstLineLastWord = string.firstLine?.byWords.last         // day
let firstLineLast2Words = string.firstLine?.byWords.suffix(2)  // ["good", "day"]
Run Code Online (Sandbox Code Playgroud)


Vin*_*ath 6

我更喜欢使用CharacterSet,因为单词可以用空格和标点符号分隔。

var myString    = "Today was a good day"
let nonLetters  = CharacterSet.letters.inverted
let first       = myString.components(separatedBy: nonLetters).first
Run Code Online (Sandbox Code Playgroud)