2017-03-15 4 views
5

編集:既にこの質問に似た質問がありますが、数字は特定の文字(Get no. Of words in swift for average calculator)で区切られています。代わりに、この質問はさまざまな方法で区切られたテキスト内の実際の単語の数を取得しようとしています:改行、改行、スペース、スペース以上などSwiftのテキスト内の実際の単語の数を取得する方法

私はスウィフト3で文字列内の単語。

私はこのコードを使用していますが、有効数字の代わりにスペースと改行を数えてしまうため、不正確な結果になります。

let str = "Architects and city planners,are \ndesigning buildings to create a better quality of life in our urban areas." 
// 18 words, 21 spaces, 2 lines 

let components = str.components(separatedBy: .whitespacesAndNewlines) 

let a = components.count 

print(a) 
// 23 instead of 18 
+0

@LeoDabusあなたはこの質問に答える前に、あなたがリンクした質問やあなたの答えを見たことがありませんでしたが、あなたの答えは*この*質問に対する完璧な答えと正しい答えの両方に見えます。それは、答えは多かれ少なかれ同一であるが、タイトルと質問のテキストはどちらも似ていないと私はあなたがこの質問から与えられた検索用語にリンクした質問を見つけるのは難しいと思う。そのように私は、質問を重複と呼ぶのはストレッチだと思う。 – par

+0

@LeoDabus私はこの質問がどう違うかを説明しました – Cue

答えて

9

連続するスペースや改行を1つの汎用の空白領域に合体されていないので、あなたは、単に連続した空白文字の間に空の「言葉」の束を取得しています。空の文字列をフィルタリングすることで、この取り除く:

let components = str.components(separatedBy: .whitespacesAndNewlines) 
let words = components.filter { !$0.isEmpty } 

print(words.count) // 17 

文字列"planners,are"が一つの単語として扱われるので、あなたは、区切り文字として,を含めていないため、上記の17を印刷します。

あなたはそのようなセパレータのセットに句読点を追加することにより、同様にその文字列を分割することができます

let chararacterSet = CharacterSet.whitespacesAndNewlines.union(.punctuationCharacters) 
let components = str.components(separatedBy: chararacterSet) 
let words = components.filter { !$0.isEmpty } 

print(words.count) // 18 

あなたが期待するように今、あなたは18のカウントが表示されます。

関連する問題