Swift 2まで)この拡張機能を使用して、複数の空白を削除しました。
func condenseWhitespace() -> String {
let components = self.componentsSeparatedByCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet()).filter({!Swift.isEmpty($0)})
return " ".join(components)
}
しかし、Swift 2の場合、エラーが発生します
タイプ '(String)'の引数リストで 'isEmpty'を呼び出すことはできません
Swift 2で複数のスペースを削除するにはどうすればよいですか?Thnx!
Swift 2では、join
はjoinWithSeparator
になり、配列で呼び出します。
filter
では、現在の反復アイテム$0
でisEmpty
を呼び出す必要があります。
質問のように、空白と改行文字を一意のスペース文字に置き換えるには:
extension String {
func condenseWhitespace() -> String {
let components = self.componentsSeparatedByCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())
return components.filter { !$0.isEmpty }.joinWithSeparator(" ")
}
}
let result = "Hello World.\nHello!".condenseWhitespace() // "Hello World. Hello!"
関数はパラメータを受け取らないため、代わりにプロパティにすることができます。
extension String {
var condensedWhitespace: String {
let components = self.componentsSeparatedByCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())
return components.filter { !$0.isEmpty }.joinWithSeparator(" ")
}
}
let result = "Hello World.\nHello!".condensedWhitespace // "Hello World. Hello!"
Swiftではさらに多くの変更があります。
関数:
extension String {
func condenseWhitespace() -> String {
let components = self.components(separatedBy: NSCharacterSet.whitespacesAndNewlines)
return components.filter { !$0.isEmpty }.joined(separator: " ")
}
}
let result = "Hello World.\nHello!".condenseWhitespace()
プロパティ:
extension String {
var condensedWhitespace: String {
let components = self.components(separatedBy: NSCharacterSet.whitespacesAndNewlines)
return components.filter { !$0.isEmpty }.joined(separator: " ")
}
}
let result = "Hello World.\nHello!".condensedWhitespace
Swift 4.2でNSCharacterSetはCharacterSetになり、ドット構文を省略して使用できます。
extension String {
func condenseWhitespace() -> String {
let components = self.components(separatedBy: .whitespacesAndNewlines)
return components.filter { !$0.isEmpty }.joined(separator: " ")
}
}
let result = "Hello World.\nHello!".condenseWhitespace() // "Hello World. Hello!"
分割文字列から配列へ、次に結合再びメモリ効率が悪い。その多くのメモリを取ります。この場合の最良の方法は、指定された文字列をスキャンして、その文字列に対して操作を実行することです。 正規表現はテキストをスキャンするための高度な方法です。上記の結論について、解決策を以下に示します。
Swift 4.x
extension String {
func removeExtraSpaces() -> String {
return self.replacingOccurrences(of: "[\\s\n]+", with: " ", options: .regularExpression, range: nil)
}
}
使用法
let startingString = "hello world! \n\n I am here!"
let processedString = startingString.removeExtraSpaces()
print(processedString)
出力:
processedString => "hello world!I am here!"
独自の要件に応じてさらに多くのことを実行できますが、ここで指摘しているのは、大量のメモリを消費する配列を作成するのではなく、文字列で正規表現を使用することです。
Swift 3:クリーナーバージョン
extension String {
var condensedWhitespace: String {
let components = self.components(separatedBy: .whitespacesAndNewlines)
return components.filter { !$0.isEmpty }.joined(separator: " ")
}
}
これが私のものです:それが実際にどのように機能したか。
extension String {
func removeExtraSpaces() -> String {
var data = ""
var numberOfSpace = 0
let items = self.getComponents(separatedBy: " ")
for item in items{
if item == " "{
numberOfSpace = numberOfSpace + 1
}else{
numberOfSpace = 0
}
if numberOfSpace == 1 || numberOfSpace == 0 {
data = data + item
//data.append(item)
}
}
return data
}
}
使用法
var message = "What is the purpose of life?"
message = message.removeExtraSpaces()
print(message)
出力:
人生の目的は何ですか?
最もクリーンなバージョン。文書化され、メモリ効率が高く、非常に使いやすい。
extension String {
/// Returns a condensed string, with no extra whitespaces and no new lines.
var condensed: String {
return replacingOccurrences(of: "[\\s\n]+", with: " ", options: .regularExpression, range: nil)
}
/// Returns a condensed string, with no whitespaces at all and no new lines.
var extraCondensed: String {
return replacingOccurrences(of: "[\\s\n]+", with: "", options: .regularExpression, range: nil)
}
}
let a = " Hello\n I am a string ".condensed
let b = " Hello\n I am a string ".extraCondensed
a:「こんにちは私はひもです」
b:「HelloIamastring」
var str = "Hello World.\nHello!"
if let regex = try? NSRegularExpression(pattern: "\\s+", options:NSRegularExpression.Options.caseInsensitive)
{
str = regex.stringByReplacingMatches(in: str, options: [], range: NSMakeRange(0, str.count), withTemplate: " ")
}