แยกสตริงเป็นอาร์เรย์ใน Swift หรือไม่


688

พูดว่าฉันมีสตริงที่นี่:

var fullName: String = "First Last"

ฉันต้องการแยกสตริงฐานใน white space และกำหนดค่าให้กับตัวแปรตามลำดับ

var fullNameArr = // something like: fullName.explode(" ") 

var firstName: String = fullNameArr[0]
var lastName: String? = fullnameArr[1]

นอกจากนี้บางครั้งผู้ใช้อาจไม่มีนามสกุล


13
สวัสดีฉันไม่มี Mac เพื่อตรวจสอบ แต่คุณสามารถลอง 'fullName.componentsSeparatedByString (string: "")' อย่าคัดลอกและวางใช้การเติมข้อความอัตโนมัติเพื่อให้ได้ฟังก์ชันที่ถูกต้อง
David Gölzhäuser

หากคุณแยกตัวละครเพียงตัวเดียวให้ใช้การfullName.utf8.split( <utf-8 character code> )ทำงานเช่นกัน (แทนที่.utf8ด้วย.utf16สำหรับ UTF-16) ตัวอย่างเช่นการแยก+สามารถทำได้โดยใช้fullName.utf8.split(43)
Jojodmo

นอกจากนี้บางครั้งนามสกุลมีช่องว่างในพวกเขาเช่นเดียวกับใน "Daphne du Maurier" หรือ "Charles de Lint"
Berry

คำตอบ:


784

วิธีที่รวดเร็วคือการใช้splitฟังก์ชั่นทั่วโลกเช่น:

var fullName = "First Last"
var fullNameArr = split(fullName) {$0 == " "}
var firstName: String = fullNameArr[0]
var lastName: String? = fullNameArr.count > 1 ? fullNameArr[1] : nil

ด้วยสวิฟท์ 2

ใน Swift 2 การใช้ตัวแยกจะซับซ้อนขึ้นเล็กน้อยเนื่องจากมีการแนะนำประเภท CharacterView ภายใน ซึ่งหมายความว่า String จะไม่ใช้โปรโตคอล SequenceType หรือ CollectionType อีกต่อไปและคุณต้องใช้.charactersคุณสมบัติเพื่อเข้าถึงการแทนค่าชนิด 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 

98
ในการทดสอบของฉัน componentsSeparatedByString มักจะเร็วกว่าอย่างมากโดยเฉพาะเมื่อจัดการกับสตริงที่ต้องแบ่งเป็นหลาย ๆ ส่วน แต่สำหรับตัวอย่างที่ระบุไว้โดย OP อย่างใดอย่างหนึ่งควรจะพอเพียง
Casey Perkins

9
ในฐานะของ Xcode 6.2b3 แยกsplit("a:b::c:", {$0 == ":"}, maxSplit: Int.max, allowEmptySlices: false)สามารถใช้เป็น
Pascal

14
เพียงจำไว้ว่าคุณยังคงต้องใช้componentsSeparatedByString()วิธีการเก่าถ้าตัวแยกของคุณมีความยาวมากกว่าตัวอักษรตัวเดียว และเด็ดอย่างที่ควรจะบอกlet (firstName, lastName) = split(fullName) {$0 == ' '}ว่ามันใช้งานไม่ได้เศร้า
NRitH

3
@Kashif จากนั้นคุณสามารถใช้split("a,b;c,d") {$0 == "," || $0 == ";"}หรือsplit("a,b;c,d") {contains(",;", $0)}
อีธาน

4
รหัสที่ถูกต้องสำหรับ Xcode 7.0 คือให้ fullNameArr = fullName.characters.split {$ 0 == ""} .map (String.init) พยายามแก้ไข แต่ถูกปฏิเสธ
skagedal

1015

เพียงแค่เรียก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]

3
โปรดทราบว่านี่เป็นพื้นฐานจริง ๆNSString(Swift แลกเปลี่ยนโดยอัตโนมัติเมื่อนำเข้าFoundation)
สามารถ

1
ซึ่งไม่มีในกรณีของ Swift 1.2 ซึ่ง Apple ไม่แปลงสตริงของ Swift เป็น NSString โดยอัตโนมัติอีกต่อไป
elcuco

6
คำตอบนี้ใช้ได้ใน Xcode 7 beta 4 และ Swift 2.0 ตอนนี้ Xcode ทำวิธีการพื้นฐานแบบอัตโนมัติบนวัตถุ Swift String โดยไม่ต้องทำการพิมพ์แบบไปที่ NSString ซึ่งไม่ใช่กรณีใน Xcode 6.4 ด้วย Swift 1.2
Andrew

1
มันไม่ทำงานใน REPL จนกว่าฉันจะนำเข้ามูลนิธิ
Velizar Hristov

1
สิ่งนี้ทำงานได้อย่างที่คาดหวัง (เช่น fullNameArr คือ[String]) ใน Xcode 7.2
Jon Cox

185

วิธีที่ง่ายที่สุดในการทำเช่นนี้คือการใช้ 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]

มีเอกสารนี้ที่ไหนบ้างโมรี? ถ้าฉันต้องแยกสิ่งอื่นนอกเหนือจากตัวละครเดียวล่ะ?
NRitH

10
@NRitH พิจารณา .componentsSeparatedByCharactersInSet(.whitespaceAndNewlineCharacterSet())
rmp251

@Crashalot มีสองฟังก์ชั่น: componentsSeparatedByStringและcomponentsSeparatedByCharactersInSet
rmp251

132

Swift Dev 4.0 (24 พฤษภาคม 2017)

ฟังก์ชั่นใหม่splitใน Swift 4 ( 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

นี่คือวิธีที่ตัวคั่นหลายตัวพร้อมอาร์เรย์

import Foundation
let mathString: String = "12-37*2/5"
let numbers = mathString.components(separatedBy: ["-", "*", "/"])
print(numbers)

เอาท์พุท:

["12", "37", "2", "5"]

8
ตรวจสอบให้แน่ใจว่าได้เพิ่มimport Foundationชั้นเรียนที่คุณใช้สิ่งนี้ใน #SavedYouFiveMinutes
Adrian

4
ข้อควรระวัง (Swift 4): หากคุณมีสตริงเหมือนlet a="a,,b,c"และคุณใช้a.split(separator: ",")คุณจะได้รับอาร์เรย์เช่น["a", "b", c"]โดยค่าเริ่มต้น สิ่งนี้สามารถเปลี่ยนแปลงได้โดยใช้omittingEmptySubsequences: falseซึ่งเป็นจริงโดยค่าเริ่มต้น
OderWat

2
มีตัวละครหลายตัวแยกใน Swift 4+ หรือไม่
pkamb

57

Swift 4 หรือใหม่กว่า

หากคุณเพียงแค่ต้องถูกจัดรูปแบบชื่อของบุคคลที่คุณสามารถใช้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"

1
@DarrellRoot คุณเพียงต้องการแมป substringsfullName.split { $0.isWhitespace }.map(String.init)
Leo Dabus

2
ฉันชอบ API ตัวใหม่ แต่จำไว้ว่ามันคืนค่า Substrings ฉันต้องการ Strings (และต้องการแยกช่องว่างโดยทั่วไป) ดังนั้นฉันจึงทำสิ่งนี้: let words = line.split{ $0.isWhitespace }.map{ String($0)} ขอบคุณ @LeoDabus สำหรับเวอร์ชันของคุณ (ความคิดเห็นดั้งเดิมของฉันมีรหัสหายไป) นอกจากนี้ฉันขอแนะนำให้ย้ายรุ่น Swift 5 ไปด้านบนสุดของคำตอบ
ดาร์เรลรูต

53

เป็นทางเลือกแทนคำตอบของ 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"]

2
คำตอบที่มีประโยชน์ที่สุดในมุมมองของฉันเนื่องจากคุณอาจต้องการอนุญาตให้มีการแยกสตริงด้วย,หรือ;หรือตัวคั่นอื่น ๆ
Chris


34

ปัญหาช่องว่าง

โดยทั่วไปผู้คนจะสร้างปัญหาขึ้นมาใหม่และแก้ปัญหาที่ไม่ดีได้บ่อย นี่เป็นพื้นที่หรือไม่? "" และสิ่งที่เกี่ยวกับ "\ n", "\ t" หรืออักขระช่องว่างแบบ Unicode บางตัวที่คุณไม่เคยเห็นมาก่อนในส่วนเล็ก ๆ เพราะมันมองไม่เห็น ในขณะที่คุณสามารถหนีไปด้วย

ทางออกที่อ่อนแอ

import Foundation
let pieces = "Mary had little lamb".componentsSeparatedByString(" ")

หากคุณจำเป็นต้องจับการจับของคุณกับความเป็นจริงดูวิดีโอ WWDC ในสตริงหรือวันที่ กล่าวโดยสรุปคือเกือบจะดีกว่าเสมอที่จะอนุญาตให้แอปเปิ้ลแก้ไขงานทางโลกประเภทนี้

โซลูชันที่ทนทาน: ใช้ NSCharacterSet

วิธีการทำอย่างถูกต้องคือ IMHO คือใช้NSCharacterSetตามที่ระบุไว้ก่อนหน้านี้ช่องว่างของคุณอาจไม่ใช่สิ่งที่คุณคาดหวังและ Apple ได้จัดเตรียมชุดอักขระช่องว่างไว้ ในการสำรวจชุดอักขระต่าง ๆ ที่มีให้ตรวจสอบเอกสารประกอบนักพัฒนา NSCharacterSetของ Apple จากนั้นเพิ่มหรือสร้างชุดอักขระใหม่หากไม่ตรงกับความต้องการของคุณ

NSCharacterSet whitespaces

ส่งคืนชุดอักขระที่มีอักขระในหมวดหมู่ทั่วไป Unicode Zs และ 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)

2
ตกลง สิ่งแรกที่เกิดขึ้นกับฉันหลังจากเห็นคำตอบที่แยกโดย "" คือ: จะเกิดอะไรขึ้นหากข้อความที่ป้อนมีช่องว่างต่อเนื่องหลายช่อง เกิดอะไรขึ้นถ้ามันมีแท็บ พื้นที่เต็มความกว้าง (CJK)? ฯลฯ
Nicolas Miari

31

ใน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!"]"

โดยเอกสารประกอบของ Apple ....

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

23

Swift 4 ช่วยให้แยกตัวละครได้ง่ายขึ้นเพียงแค่ใช้ฟังก์ชั่นแยกใหม่สำหรับ Strings

ตัวอย่าง: let s = "hi, hello" let a = s.split(separator: ",") print(a)

ตอนนี้คุณได้อาร์เรย์ด้วย 'สวัสดี' และ 'สวัสดี'


โปรดทราบว่าสิ่งนี้จะไม่ส่งคืนอาเรย์ของสตริง แต่เป็นอาเรย์ของสตริงย่อยที่ไม่น่าใช้
บทร้อง

19

อัปเดตสำหรับ 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", "BALL", "BALL", "บิน", "ไกล", "ไกล", "หลัง", "มัน", "เดิม" "," hit "," "," Hello "," "," Hie "," "," อย่างไร "," r "," u "," "]

อย่างไรก็ตามหากคุณต้องการกรองสตริงว่าง

let words = paragraph.components(separatedBy: [",", " ", "!",".","?"]).filter({!$0.isEmpty})

เอาท์พุท

["Bob", "hit", "a", "ball", "the", "hit", "BALL", "บิน", "ไกล", "หลัง", "หลัง", "มัน", "ถูก" กด "," Hello "," Hie "," How "," r "," u "]

แต่ต้องแน่ใจว่านำเข้ารากฐาน


17

สวิฟท์ 3

let line = "AAA    BBB\t CCC"
let fields = line.components(separatedBy: .whitespaces).filter {!$0.isEmpty}
  • ผลตอบแทนที่ได้สามสายAAA, BBBและCCC
  • กรองฟิลด์ว่าง
  • จัดการช่องว่างและตัวละครหลายตาราง
  • หากคุณต้องการจัดการกับบรรทัดใหม่ให้แทนที่.whitespacesด้วย.whitespacesAndNewlines


13

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

9

ฉันมีสถานการณ์ที่สามารถมีตัวควบคุมหลายตัวในสตริงที่ฉันต้องการแยก แทนที่จะปล่อยให้สิ่งเหล่านี้คงอยู่ฉันแค่ให้ Apple จัดการส่วนนั้น

การทำงานต่อไปนี้กับ Swift 3.0.1 บน iOS 10:

let myArray = myString.components(separatedBy: .controlCharacters)

8

ฉันพบกรณีที่น่าสนใจ

วิธีที่ 1

var data:[String] = split( featureData ) { $0 == "\u{003B}" }

เมื่อฉันใช้คำสั่งนี้เพื่อแยกสัญลักษณ์บางอย่างจากข้อมูลที่โหลดจากเซิร์ฟเวอร์มันสามารถแยกขณะทดสอบในโปรแกรมจำลองและซิงค์กับอุปกรณ์ทดสอบ แต่จะไม่แยกในแอปเผยแพร่และ Ad Hoc

ฉันใช้เวลานานมากในการติดตามข้อผิดพลาดนี้อาจสาปแช่งจาก Swift Version บางรุ่นหรือ iOS เวอร์ชันบางส่วนหรือทั้งสองอย่าง

มันไม่เกี่ยวกับโค้ด HTML ด้วยเนื่องจากฉันพยายามstringByRemovingPercentEncodingและมันก็ยังใช้งานไม่ได้

นอกจากนี้ 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("")

1
ฉันจะบอกว่านี่เป็นสถานะที่ใกล้เคียงกับคำว่า "ไม่ใช่คำตอบ" ซึ่งส่วนใหญ่เป็นคำอธิบายเกี่ยวกับคำตอบที่มีอยู่ แต่มันก็ชี้ให้เห็นสิ่งที่สำคัญ
rickster

8

ส่วนใหญ่ของคำตอบเหล่านี้จะถือว่าการป้อนข้อมูลประกอบด้วยช่องว่าง - ไม่ขาวพื้นที่และพื้นที่เดียวที่ว่า หากคุณสามารถตั้งสมมติฐานได้อย่างปลอดภัยคำตอบที่ได้รับการยอมรับ (จากเบนเน็ตต์) นั้นค่อนข้างสง่างามและเป็นวิธีที่ฉันจะไปด้วยเมื่อฉันทำได้

เมื่อเราไม่สามารถตั้งสมมติฐานดังกล่าวได้โซลูชั่นที่มีประสิทธิภาพยิ่งกว่านั้นจะต้องครอบคลุมประเด็นต่อไปนี้ซึ่งคำตอบส่วนใหญ่ที่นี่จะไม่พิจารณา:

  • แท็บ / newlines / ช่องว่าง (ช่องว่าง) รวมถึงตัวละครที่เกิดขึ้นประจำ
  • นำ / ช่องว่างต่อท้าย
  • อักขระขึ้นบรรทัดใหม่ของApple / Linux ( \n) และ Windows ( \r\n)

เพื่อครอบคลุมกรณีเหล่านี้โซลูชันนี้ใช้ regex เพื่อแปลงช่องว่างทั้งหมด (รวมถึงอักขระที่เกิดซ้ำและอักขระขึ้นบรรทัดใหม่ของ 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"]

6

หรือไม่มีการปิดคุณสามารถทำได้ใน Swift 2:

let fullName = "First Last"
let fullNameArr = fullName.characters.split(" ")
let firstName = String(fullNameArr[0])

6

ขั้นตอนในการแบ่งสตริงเป็นอาร์เรย์ใน Swift 4

  1. กำหนดสตริง
  2. ขึ้นอยู่กับ @ splitting

หมายเหตุ: variableName.components (แยกจากกันโดย: "คำหลักแยก")

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)

4

สวิฟท์ 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

3

สมมติว่าคุณมีตัวแปรชื่อ "Hello World" และหากคุณต้องการแยกมันออกและเก็บไว้ในตัวแปรที่ต่างกันสองตัวคุณสามารถใช้ดังนี้

var fullText = "Hello World"
let firstWord = fullText.text?.components(separatedBy: " ").first
let lastWord = fullText.text?.components(separatedBy: " ").last

3

เฉพาะsplitคำตอบที่ถูกต้องเท่านั้นนี่คือข้อแตกต่างสำหรับพื้นที่มากกว่า 2 รายการ

var temp = "Hello world     ni hao"
let arr  = temp.components(separatedBy: .whitespacesAndNewlines)
// ["Hello", "world", "", "", "", "", "ni", "hao"]
let arr2 = temp.components(separatedBy: " ")
// ["Hello", "world", "", "", "", "", "ni", "hao"]
let arr3 = temp.split(whereSeparator: {$0 == " "})
// ["Hello", "world", "ni", "hao"]


2

Swift 2.2 การ จัดการข้อผิดพลาด & ตัวพิมพ์ใหญ่ที่เพิ่มเข้ามา:

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
}

2

การจัดการสตริงยังคงเป็นสิ่งที่ท้าทายใน Swift และมันยังคงเปลี่ยนแปลงอย่างมีนัยสำคัญดังที่คุณเห็นจากคำตอบอื่น ๆ หวังว่าทุกอย่างจะสงบลงและมันก็จะง่ายขึ้น นี่เป็นวิธีที่จะทำกับ Swift เวอร์ชัน 3.0 ปัจจุบันที่มีตัวคั่นหลายตัว

สวิฟท์ 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)

2

ฉันกำลังมองหาการแยกแบบหลวมๆ เช่น PHP explodeที่มีการรวมลำดับที่ว่างในอาร์เรย์ผลลัพธ์ผลลัพธ์นี้ใช้ได้สำหรับฉัน:

"First ".split(separator: " ", maxSplits: 1, omittingEmptySubsequences: false)

เอาท์พุท:

["First", ""]

2

สิ่งนี้จะช่วยให้อาร์เรย์ของชิ้นส่วนแยกโดยตรง

var fullNameArr = fullName.components(separatedBy:" ")

จากนั้นคุณสามารถใช้เช่นนี้

var firstName: String = fullNameArr[0]
var lastName: String? = fullnameArr[1]


1

สำหรับ 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]

1

นี่คือขั้นตอนวิธีการที่ฉันเพียงแค่สร้างซึ่งจะแยกStringโดยใด ๆCharacterจากอาร์เรย์และหากมีความปรารถนาที่จะให้สตริงที่มีตัวอักษร splitted หนึ่งสามารถตั้งค่าพารามิเตอร์swallowtrue

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", "--"]
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.