例如,如果有这样的情况:
var myString = "Today was a good day"
返回第一个单词,即“ Today”的最佳方法是什么?我认为应该应用映射,但不确定如何应用。
谢谢。
我能想到的最简单的方法是
let string = "hello world"
let firstWord = string.components(separatedBy: " ").first
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()
您可以将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"]
我更喜欢使用CharacterSet
,因为单词可以由空格和标点符号分隔。
var myString = "Today was a good day"
let nonLetters = CharacterSet.letters.inverted
let first = myString.components(separatedBy: nonLetters).first
为了避免为了得到第一个单词而处理整个字符串,您可以这样做:
let string = "Hello World"
let word1 = string.prefix{ (c:Character) in CharacterSet.letters.contains(c.unicodeScalars.first!) }