web-dev-qa-db-ja.com

Swift 4の特定の範囲の部分文字列を取得する方法は?

これは公式の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!"_と言って、この文で2番目のWordのみを取得(部分文字列)にしたいですか?ですから、「そこ」という言葉だけが欲しいのです。

「world!」を使ってみましたlet endOfSentence = greeting.index(of: "world!")!のような引数として、Swift 4 Playgroundはそれが好きではありません。'Character 'が必要で、私の引数は文字列です。

それでは、どうすれば非常に正確な部分範囲の部分文字列を取得できますか?または、将来の使用に向けて文のn番目のWordを取得しますか?

8
Kent Wong

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])
11
Charles Srstka

Swift4の場合、

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

最初の答えには間違いが1つあります。

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"
}
3
Wade

古い習慣は激しく死にます。 「Java」の方法で行い、文字列をスペースで分割し、2番目のWordにアクセスしました。

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

In Swift 5 encodedOffset(Swift 4 func)は非推奨です。
tf160Offset を使用する必要があります

// 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])

プリント->はじめまして!

0
kthorat