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

问题描述 投票:5回答:4

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

 var myString = "Today was a good day"

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

谢谢。

swift string swift-playground
4个回答
14
投票

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

Swift 3

let string = "hello world"
let firstWord = string.components(separatedBy: " ").first

Swift 2.2

let string = "hello world"
let firstWord = string.componentsSeparatedByString(" ").first

并且,如果您认为您需要在代码中大量使用它,请将其作为extension

extension String {
    func firstWord() -> String? {
        return self.components(separatedBy: " ").first
    }
}

用法

let string = "hello world"
let firstWord = string.firstWord()

7
投票

您可以将StringProtocol方法enumerateSubstrings(in: Range<String.Index>)与选项.byWords结合使用,以枚举字符串中的单词并仅获取第一个元素:

Swift 5.1•Xcode 11或更高版本

注意:对于较早的Swift语法,请检查这篇文章history

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

游乐场测试:

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"]

2
投票

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

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

0
投票

为了避免为了得到第一个单词而处理整个字符串,您可以这样做:

let string = "Hello World"
let word1  = string.prefix{ (c:Character) in CharacterSet.letters.contains(c.unicodeScalars.first!) }
© www.soinside.com 2019 - 2024. All rights reserved.