ここに文字列があるとします。
var fullName: String = "First Last"
文字列ベースを空白に分割し、それぞれの変数に値を割り当てたい
var fullNameArr = // something like: fullName.explode(" ")
var firstName: String = fullNameArr[0]
var lastName: String? = fullnameArr[1]
また、ユーザーに姓がない場合もあります。
Swiftの方法は、次のようにグローバルなsplit
関数を使うことです。
var fullName = "First Last"
var fullNameArr = split(fullName) {$0 == " "}
var firstName: String = fullNameArr[0]
var lastName: String? = fullNameArr.count > 1 ? fullNameArr[1] : nil
付きSwift 2
Swift 2では、内部のCharacterView型が導入されたため、splitの使用が少し複雑になりました。つまり、StringはSequenceTypeまたはCollectionTypeプロトコルを採用しなくなり、代わりに.characters
プロパティを使用してStringインスタンスのCharacterView型表現にアクセスする必要があります。 (注:CharacterViewはSequenceTypeおよびCollectionTypeプロトコルを採用していません)。
let fullName = "First Last"
let fullNameArr = fullName.characters.split{$0 == " "}.map(String.init)
// or simply:
// let fullNameArr = fullName.characters.split{" "}.map(String.init)
fullNameArr[0] // First
fullNameArr[1] // Last
componentsSeparatedByString
のfullName
メソッドを呼び出すだけです。
import Foundation
var fullName: String = "First Last"
let fullNameArr = fullName.componentsSeparatedByString(" ")
var firstName: String = fullNameArr[0]
var lastName: String = fullNameArr[1]
Swift 3+用に更新
import Foundation
let fullName = "First Last"
let fullNameArr = fullName.components(separatedBy: " ")
let name = fullNameArr[0]
let surname = fullNameArr[1]
これを行う最も簡単な方法は、componentsSeparatedByを使用することです。
Swift 2の場合:
import Foundation
let fullName : String = "First Last";
let fullNameArr : [String] = fullName.componentsSeparatedByString(" ")
// And then to access the individual words:
var firstName : String = fullNameArr[0]
var lastName : String = fullNameArr[1]
Swift 3の場合:
import Foundation
let fullName : String = "First Last"
let fullNameArr : [String] = fullName.components(separatedBy: " ")
// And then to access the individual words:
var firstName : String = fullNameArr[0]
var lastName : String = fullNameArr[1]
スイフト開発者。 4.0(2017年5月24日)
Swift 4の新機能split
( Beta )。
import Foundation
let sayHello = "Hello Swift 4 2017";
let result = sayHello.split(separator: " ")
print(result)
出力:
["Hello", "Swift", "4", "2017"]
値にアクセスする:
print(result[0]) // Hello
print(result[1]) // Swift
print(result[2]) // 4
print(result[3]) // 2017
Xcode 8.1/Swift 3.0.1
これは、arrayを使った複数の区切り記号です。
import Foundation
let mathString: String = "12-37*2/5"
let numbers = mathString.components(separatedBy: ["-", "*", "/"])
print(numbers)
出力:
["12", "37", "2", "5"]
WMiosの答えに代わるものとして、あなたはcomponentsSeparatedByCharactersInSet
を使うこともできます。
あなたの具体的な入力とともに:
let separators = NSCharacterSet(charactersInString: " ")
var fullName: String = "First Last";
var words = fullName.componentsSeparatedByCharactersInSet(separators)
// words contains ["First", "Last"]
複数のセパレータを使用する:
let separators = NSCharacterSet(charactersInString: " ,")
var fullName: String = "Last, First Middle";
var words = fullName.componentsSeparatedByCharactersInSet(separators)
// words contains ["Last", "First", "Middle"]
スイフト4
let words = "these words will be elements in an array".components(separatedBy: " ")
Xcode 9 Swift 4 または Xcode 8.2.1•Swift 3.0.2
個人名を正しくフォーマットするだけでよい場合は、 PersonNameComponentsFormatter を使用できます。
PersonNameComponentsFormatterクラスは、PersonNameComponentsオブジェクトで表されるように、個人の名前のコンポーネントのローカライズされた表現を提供します。このクラスを使用して、個人名情報をユーザーに表示するときにローカライズされた名前を作成します。
// iOS (9.0 and later), macOS (10.11 and later), tvOS (9.0 and later), watchOS (2.0 and later)
let nameFormatter = PersonNameComponentsFormatter()
let name = "Mr. Steven Paul Jobs Jr."
// personNameComponents requires iOS (10.0 and later)
if let nameComps = nameFormatter.personNameComponents(from: name) {
nameComps.namePrefix // Mr.
nameComps.givenName // Steven
nameComps.middleName // Paul
nameComps.familyName // Jobs
nameComps.nameSuffix // Jr.
// It can also be configured to format your names
// Default (same as medium), short, long or abbreviated
nameFormatter.style = .default
nameFormatter.string(from: nameComps) // "Steven Jobs"
nameFormatter.style = .short
nameFormatter.string(from: nameComps) // "Steven"
nameFormatter.style = .long
nameFormatter.string(from: nameComps) // "Mr. Steven Paul Jobs jr."
nameFormatter.style = .abbreviated
nameFormatter.string(from: nameComps) // SJ
// It can also be use to return an attributed string using annotatedString method
nameFormatter.style = .long
nameFormatter.annotatedString(from: nameComps) // "Mr. Steven Paul Jobs jr."
}
編集/更新:
Swift 5以降
文字列を文字以外の文字で分割するだけの場合は、新しいCharacterプロパティ isLetter
を使用できます。
let fullName = "First Last"
let components = fullName.split{ !$0.isLetter }
print(components) // "["First", "Last"]\n"
一般に、人々はこの問題と悪い解決策を何度も再発明します。これはスペースですか? ""とこれまで見たことのない "\ n"、 "\ t"、またはUnicodeの空白文字については、目に見えないため、少なからずです。あなたが逃げることができる間
import Foundation
let pieces = "Mary had little lamb".componentsSeparatedByString(" ")
現実を握る必要がある場合は、文字列または日付でWWDCビデオをご覧ください。一言で言えば、Appleがこの種の日常的なタスクを解決できるようにするのが、ほとんどの場合より優れています。
これを正しく行う方法は、私見ですが、NSCharacterSet
を使うことです。先に述べたように、あなたの空白はあなたが期待するものではないかもしれず、そしてAppleは空白文字セットを提供しています。提供されているさまざまな文字セットを調べるには、Appleの NSCharacterSet開発者用ドキュメント を調べてください。
Unicodeの一般カテゴリZとCHARACTER TABULATION(U + 0009)の文字を含む文字セットを返します。
let longerString: String = "This is a test of the character set splitting system"
let components = longerString.components(separatedBy: .whitespaces)
print(components)
Swift 4.2およびXcode 10
//This is your str
let str = "This is my String" //Here replace with your string
オプション1
let items = str.components(separatedBy: " ")//Here replase space with your value and the result is Array.
//Direct single line of code
//let items = "This is my String".components(separatedBy: " ")
let str1 = items[0]
let str2 = items[1]
let str3 = items[2]
let str4 = items[3]
//OutPut
print(items.count)
print(str1)
print(str2)
print(str3)
print(str4)
print(items.first!)
print(items.last!)
オプション2
let items = str.split(separator: " ")
let str1 = String(items.first!)
let str2 = String(items.last!)
//Output
print(items.count)
print(items)
print(str1)
print(str2)
オプション3
let arr = str.split {$0 == " "}
print(arr)
オプション4
let line = "BLANCHE: I don't want realism. I want magic!"
print(line.split(separator: " "))
// Prints "["BLANCHE:", "I", "don\'t", "want", "realism.", "I", "want", "magic!"]"
let line = "BLANCHE: I don't want realism. I want magic!"
print(line.split(separator: " "))
// Prints "["BLANCHE:", "I", "don\'t", "want", "realism.", "I", "want", "magic!"]"
print(line.split(separator: " ", maxSplits: 1))//This can split your string into 2 parts
// Prints "["BLANCHE:", " I don\'t want realism. I want magic!"]"
print(line.split(separator: " ", maxSplits: 2))//This can split your string into 3 parts
print(line.split(separator: " ", omittingEmptySubsequences: false))//array contains empty strings where spaces were repeated.
// Prints "["BLANCHE:", "", "", "I", "don\'t", "want", "realism.", "I", "want", "magic!"]"
print(line.split(separator: " ", omittingEmptySubsequences: true))//array not contains empty strings where spaces were repeated.
print(line.split(separator: " ", maxSplits: 4, omittingEmptySubsequences: false))
print(line.split(separator: " ", maxSplits: 3, omittingEmptySubsequences: true))
Swift 4では、文字列の分割がはるかに簡単になりました。文字列には新しい分割関数を使用するだけです。
例:let s = "hi, hello" let a = s.split(separator: ",") print(a)
これで、 'hi'と 'hello'の配列ができました。
スイフト3
let line = "AAA BBB\t CCC"
let fields = line.components(separatedBy: .whitespaces).filter {!$0.isEmpty}
AAA
、BBB
、およびCCC
を返します。.whitespaces
を.whitespacesAndNewlines
に置き換えます。Xcode 8.0/Swift 3
let fullName = "First Last"
var fullNameArr = fullName.components(separatedBy: " ")
var firstname = fullNameArr[0] // First
var lastname = fullNameArr[1] // Last
長い道のり:
var fullName: String = "First Last"
fullName += " " // this will help to see the last Word
var newElement = "" //Empty String
var fullNameArr = [String]() //Empty Array
for Character in fullName.characters {
if Character == " " {
fullNameArr.append(newElement)
newElement = ""
} else {
newElement += "\(Character)"
}
}
var firsName = fullNameArr[0] // First
var lastName = fullNameArr[1] // Last
分割したいストリングに複数の制御文字が存在する可能性があるというシナリオがありました。これらの配列を維持するのではなく、Appleにその部分を処理させるだけです。
以下はiOS 10上のSwift 3.0.1で動作します。
let myArray = myString.components(separatedBy: .controlCharacters)
興味深い事件が見つかりました
方法1
var data:[String] = split( featureData ) { $0 == "\u{003B}" }
このコマンドを使用してシンボル{サーバーからロードされたデータからを分割すると、シミュレータでテストしながらテストデバイスと同期しながら分割できますが、公開アプリでは分割されず、Ad Hoc
このエラーを追跡するのに私は多くの時間がかかります、それはいくつかのSwiftバージョン、またはいくつかのiOSバージョン、あるいはその両方から呪われているかもしれません
私は stringByRemovingPercentEncoding を試してみたので、HTMLコードについてもそうではありません、そしてそれはまだ動作しません
追加10/10/2015
swift 2.0では、このメソッドは次のように変更されました。
var data:[String] = featureData.split {$0 == "\u{003B}"}
方法2
var data:[String] = featureData.componentsSeparatedByString("\u{003B}")
このコマンドを使用したとき、サーバーから正しくロードされた同じデータを正しく分割できます
結論、私は本当に方法2を使用することをお勧めします
string.componentsSeparatedByString("")
Swift 4、Xcode 10、iOS 12 Updateは100%動作しています
let fullName = "First Last"
let fullNameArr = fullName.components(separatedBy: " ")
let firstName = fullNameArr[0] //First
let lastName = fullnameArr[1] //Last
詳しくは Appleのドキュメントはこちら を参照してください。
Swift 5の更新と簡単な方法
let paragraph = "Bob hit a ball, the hit BALL flew far after it was hit. Hello! Hie, How r u?"
let words = paragraph.components(separatedBy: [",", " ", "!",".","?"])
これは印刷します、
["Bob"、 "hit"、 "a"、 "ball"、 ""、 "the"、 "hit"、 "BALL"、 "fly"、 "far"、 "after"、 "it"、 "was "、" hit "、" "、" Hello "、" "、" Hie "、" "、" How "、" r "、" u "、" "]
ただし、空の文字列を除外する場合は、
let words = paragraph.components(separatedBy: [",", " ", "!",".","?"]).filter({!$0.isEmpty})
出力、
[「ボブ」、「ヒット」、「a」、「ボール」、「ザ」、「ヒット」、「ボール」、「飛ぶ」、「遠い」、「後」、「それ」、「だった」、「 hit」、「Hello」、「Hie」、「How」、「r」、「u」]
ただし、Foundationがインポートされていることを確認してください
これらの答えのほとんどは、入力にスペースが含まれていると仮定しています( white spaceは含まれていません)。あなたが安全にその仮定をすることができれば、それから(bennettからの)受け入れられた答えは非常に洗練されていて、そしてまた私がそうすることができるとき私がやります。
その仮定ができないときは、ここでほとんどの答えが考慮していない次のような考察をカバーするためのより堅牢な解決策が必要です。
\n
) と Windows(\r\n
)の改行文字このような場合をカバーするために、このソリューションは正規表現を使用してすべての空白文字(繰り返し文字とWindowsの改行文字を含む)を単一のスペースに変換し、トリムしてから単一のスペースで分割します。
スイフト3:
let searchInput = " First \r\n \n \t\t\tMiddle Last "
let searchTerms = searchInput
.replacingOccurrences(
of: "\\s+",
with: " ",
options: .regularExpression
)
.trimmingCharacters(in: .whitespaces)
.components(separatedBy: " ")
// searchTerms == ["First", "Middle", "Last"]
またはクロージャなしであなたはSwift 2でこれだけをすることができます:
let fullName = "First Last"
let fullNameArr = fullName.characters.split(" ")
let firstName = String(fullNameArr[0])
これが役に立つことを願っています
Swift 4:文字列を配列に分割する。ステップ1:文字列を割り当てます。ステップ2:@分割に基づきます。注:variableName.components(separateBy: "split keyword")
let fullName: String = "First Last @ triggerd event of the session by session storage @ it can be divided by the event of the trigger."
let fullNameArr = fullName.components(separatedBy: "@")
print("split", fullNameArr)
Swift 2.2 エラー処理&capitalizedString追加:
func setFullName(fullName: String) {
var fullNameComponents = fullName.componentsSeparatedByString(" ")
self.fname = fullNameComponents.count > 0 ? fullNameComponents[0]: ""
self.sname = fullNameComponents.count > 1 ? fullNameComponents[1]: ""
self.fname = self.fname!.capitalizedString
self.sname = self.sname!.capitalizedString
}
let str = "one two"
let strSplit = str.characters.split(" ").map(String.init) // returns ["one", "two"]
Xcode 7.2(7C68)
スイフト4
let string = "loremipsum.dolorsant.amet:"
let result = string.components(separatedBy: ".")
print(result[0])
print(result[1])
print(result[2])
print("total: \(result.count)")
出力
loremipsum
dolorsant
amet:
total: 3
「Hello World」という名前の変数があり、それを分割して2つの異なる変数に格納する場合は、次のように使用できます。
var fullText = "Hello World"
let firstWord = fullText.text?.components(separatedBy: " ").first
let lastWord = fullText.text?.components(separatedBy: " ").last
Swift 2、XCode 7.1の場合:
let complete_string:String = "Hello world"
let string_arr = complete_string.characters.split {$0 == " "}.map(String.init)
let hello:String = string_arr[0]
let world:String = string_arr[1]
これは私が作成したばかりのアルゴリズムです。これは配列から任意のString
でCharacter
を分割し、分割文字を含む部分文字列を保持したい場合はswallow
パラメータをtrue
に設定できます。
Xcode 7.3 - Swift 2.2:
extension String {
func splitBy(characters: [Character], swallow: Bool = false) -> [String] {
var substring = ""
var array = [String]()
var index = 0
for character in self.characters {
if let lastCharacter = substring.characters.last {
// swallow same characters
if lastCharacter == character {
substring.append(character)
} else {
var shouldSplit = false
// check if we need to split already
for splitCharacter in characters {
// slit if the last character is from split characters or the current one
if character == splitCharacter || lastCharacter == splitCharacter {
shouldSplit = true
break
}
}
if shouldSplit {
array.append(substring)
substring = String(character)
} else /* swallow characters that do not equal any of the split characters */ {
substring.append(character)
}
}
} else /* should be the first iteration */ {
substring.append(character)
}
index += 1
// add last substring to the array
if index == self.characters.count {
array.append(substring)
}
}
return array.filter {
if swallow {
return true
} else {
for splitCharacter in characters {
if $0.characters.contains(splitCharacter) {
return false
}
}
return true
}
}
}
}
例:
"test text".splitBy([" "]) // ["test", "text"]
"test++text--".splitBy(["+", "-"], swallow: true) // ["test", "++" "text", "--"]
Swift 5以上
let fullString = "Last First Middle"
let fullNameArr = fullString.components(separatedBy: " ")
これはBeta 5でも変更されました。これはCollectionTypeのメソッドになりました
古い:
var fullName = "First Last"
var fullNameArr = split(fullName) {$0 == " "}
新しい:
var fullName = "First Last"
var fullNameArr = fullName.split {$0 == " "}
Swift 2.2によると
2行のコードを書くだけで分割文字列が得られます。
let fullName = "FirstName LastName"
var splitedFullName = fullName.componentsSeparatedByString(" ")
print(splitedFullName[0])
print(splitedFullName[1])
楽しい。 :)
空のシーケンスが結果の配列に含まれるPHPのexplode
のように、 loosy splitを探していましたが、これは私にとって役に立ちました:
"First ".split(separator: " ", maxSplits: 1, omittingEmptySubsequences: false)
出力:
["First", ""]
あなたが他の答えからわかることができるように、文字列処理はまだSwiftにおける挑戦です、そしてそれはかなり変わり続けます。うまくいけば、物事は落ち着き、それは簡単になります。これは、現在の3.0バージョンのSwiftで複数の区切り文字を使用してそれを行う方法です。
スイフト3:
let chars = CharacterSet(charactersIn: ".,; -")
let split = phrase.components(separatedBy: chars)
// Or if the enums do what you want, these are preferred.
let chars2 = CharacterSet.alphaNumerics // .whitespaces, .punctuation, .capitalizedLetters etc
let split2 = phrase.components(separatedBy: chars2)
私は、3つ以上のコンポーネントで名前を処理し、古いiOSバージョンをサポートするソリューションを見つけていません。
struct NameComponentsSplitter {
static func split(fullName: String) -> (String?, String?) {
guard !fullName.isEmpty else {
return (nil, nil)
}
let components = fullName.components(separatedBy: .whitespacesAndNewlines)
let lastName = components.last
let firstName = components.dropLast().joined(separator: " ")
return (firstName.isEmpty ? nil : firstName, lastName)
}
}
合格したテストケース
func testThatItHandlesTwoComponents() {
let (firstName, lastName) = NameComponentsSplitter.split(fullName: "John Smith")
XCTAssertEqual(firstName, "John")
XCTAssertEqual(lastName, "Smith")
}
func testThatItHandlesMoreThanTwoComponents() {
var (firstName, lastName) = NameComponentsSplitter.split(fullName: "John Clark Smith")
XCTAssertEqual(firstName, "John Clark")
XCTAssertEqual(lastName, "Smith")
(firstName, lastName) = NameComponentsSplitter.split(fullName: "John Clark Jr. Smith")
XCTAssertEqual(firstName, "John Clark Jr.")
XCTAssertEqual(lastName, "Smith")
}
func testThatItHandlesEmptyInput() {
let (firstName, lastName) = NameComponentsSplitter.split(fullName: "")
XCTAssertEqual(firstName, nil)
XCTAssertEqual(lastName, nil)
}
var fullName = "James Keagan Michael"
let first = fullName.components(separatedBy: " ").first?.isEmpty == false ? fullName.components(separatedBy: " ").first! : "John"
let last = fullName.components(separatedBy: " ").last?.isEmpty == false && fullName.components(separatedBy: " ").last != fullName.components(separatedBy: " ").first ? fullName.components(separatedBy: " ").last! : "Doe"