Tách một chuỗi thành một mảng trong Swift?


686

Nói rằng tôi có một chuỗi ở đây:

var fullName: String = "First Last"

Tôi muốn phân chia chuỗi cơ sở trên khoảng trắng và gán các giá trị cho các biến tương ứng của chúng

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

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

Ngoài ra, đôi khi người dùng có thể không có họ.


13
Xin chào, tôi không có máy Mac để kiểm tra. Nhưng bạn có thể thử 'fullName.componentsSeparatedByString (chuỗi: "")' Không sao chép và dán, sử dụng chức năng tự động hoàn thành, để bạn có được chức năng phù hợp.
David Gölzhäuser

Nếu bạn chỉ phân tách theo một ký tự, sử dụng fullName.utf8.split( <utf-8 character code> )các tác phẩm cũng vậy (thay thế .utf8bằng .utf16UTF-16). Ví dụ: chia tách +có thể được thực hiện bằng cách sử dụngfullName.utf8.split(43)
Jojodmo

Ngoài ra, đôi khi tên cuối cùng có khoảng trắng trong chúng, như trong "Daphne du Maurier" hoặc "Charles de Lint"
Berry

Câu trả lời:


784

Cách Swift là sử dụng splitchức năng toàn cầu , như vậy:

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

với Swift 2

Trong Swift 2, việc sử dụng phân tách trở nên phức tạp hơn một chút do sự ra đời của kiểu CharacterView bên trong. Điều này có nghĩa là String không còn chấp nhận các giao thức SequenceType hoặc CollectionType và thay vào đó, bạn phải sử dụng thuộc .characterstính để truy cập vào biểu diễn kiểu CharacterView của một thể hiện String. (Lưu ý: CharacterView không áp dụng giao thức SequenceType và 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
Trong các thử nghiệm của tôi, các thành phầnSeparatedByString thường nhanh hơn đáng kể, đặc biệt là khi xử lý các chuỗi yêu cầu chia thành nhiều phần. Nhưng đối với ví dụ được liệt kê bởi OP, hoặc là đủ.
Casey Perkins

9
Kể từ khi chia Xcode 6.2b3 có thể được sử dụng như split("a:b::c:", {$0 == ":"}, maxSplit: Int.max, allowEmptySlices: false).
Pascal

14
Chỉ cần nhớ rằng bạn vẫn cần sử dụng componentsSeparatedByString()phương thức cũ nếu dấu phân cách của bạn dài hơn một ký tự. Và thật tuyệt như có thể nói let (firstName, lastName) = split(fullName) {$0 == ' '}, điều đó không hoạt động, thật đáng buồn.
NRitH

3
@Kashif sau đó bạn có thể sử dụng split("a,b;c,d") {$0 == "," || $0 == ";"}hoặcsplit("a,b;c,d") {contains(",;", $0)}
Ethan

4
Mã chính xác cho Xcode 7.0 là let fullNameArr = fullName.char character.split {$ 0 == ""} .map (String.init). Đã cố gắng để chỉnh sửa, nhưng nó đã bị từ chối.
skagedal

1015

Chỉ cần gọi componentsSeparatedByStringphương thức trên của bạnfullName

import Foundation

var fullName: String = "First Last"
let fullNameArr = fullName.componentsSeparatedByString(" ")

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

Cập nhật cho Swift 3+

import Foundation

let fullName    = "First Last"
let fullNameArr = fullName.components(separatedBy: " ")

let name    = fullNameArr[0]
let surname = fullNameArr[1]

3
Lưu ý rằng đây thực sự là một cơ sở NSString(Swift tự động hoán đổi chúng khi nhập Foundation).
Có thể

1
Đó không còn là trường hợp của Swift 1.2, trong đó Apple không còn chuyển đổi Chuỗi của Swift thành NSString một cách tự động.
elcuco

6
Câu trả lời này hoạt động trong Xcode 7 beta 4 và Swift 2.0. Xcode hiện tự động hoàn thành các phương thức Foundation trên các đối tượng Chuỗi Swift mà không cần truyền kiểu tới NSString, đây không phải là trường hợp trong Xcode 6.4 với Swift 1.2.
Andrew

1
Nó không hoạt động trong REPL cho đến khi tôi nhập Foundation.
Velizar Hristov

1
Điều này hoạt động chính xác như mong đợi (tức là fullNameArr là một [String]) trong Xcode 7.2.
Jon Cox

185

Phương pháp đơn giản nhất để thực hiện việc này là sử dụng các thành phầnSeparatedBy:

Dành cho 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]

Dành cho 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]

Đây có phải là tài liệu ở bất cứ đâu, Maury? Điều gì sẽ xảy ra nếu tôi cần phân chia trên một cái gì đó ngoài một nhân vật duy nhất?
NRitH

10
@NRitH xem xét .componentsSeparatedByCharactersInSet(.whitespaceAndNewlineCharacterSet())
rmp251

@Crashalot có hai chức năng: componentsSeparatedByStringcomponentsSeparatedByCharactersInSet
rmp251 16/07/2015

130

Swift Dev. 4.0 (ngày 24 tháng 5 năm 2017)

Một chức năng mới splittrong Swift 4 ( Beta ).

import Foundation
let sayHello = "Hello Swift 4 2017";
let result = sayHello.split(separator: " ")
print(result)

Đầu ra:

["Hello", "Swift", "4", "2017"]

Truy cập các giá trị:

print(result[0]) // Hello
print(result[1]) // Swift
print(result[2]) // 4
print(result[3]) // 2017

Xcode 8.1 / Swift 3.0.1

Đây là cách nhiều dấu phân cách với mảng.

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

Đầu ra:

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

8
Đảm bảo thêm import Foundationvào lớp bạn đang sử dụng. #SattedYouFiveMinutes
Adrian

4
Chú ý (Swift 4): Nếu bạn có một chuỗi like let a="a,,b,c"và bạn sử dụng, a.split(separator: ",")bạn sẽ nhận được một mảng như ["a", "b", c"]mặc định. Điều này có thể được thay đổi bằng cách sử dụng omittingEmptySubsequences: falseđúng theo mặc định.
OderWat

2
Bất kỳ phân chia nhiều ký tự trong Swift 4+?
pkamb

57

Swift 4 trở lên

Nếu bạn chỉ cần định dạng đúng tên người, bạn có thể sử dụng PersonNameComponentsFormatter .

Lớp PersonNameComponentsFormatter cung cấp các biểu diễn cục bộ của các thành phần của tên người, như được đại diện bởi một đối tượng PersonNameComponents. Sử dụng lớp này để tạo tên địa phương khi hiển thị thông tin tên người cho người dùng.


// 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."
}

nhập mô tả hình ảnh ở đây

chỉnh sửa / cập nhật:

Swift 5 trở lên

Để chỉ tách một chuỗi bằng các ký tự không phải chữ cái, chúng ta có thể sử dụng thuộc tính Ký tự mới isLetter:

let fullName = "First Last"

let components = fullName.split{ !$0.isLetter }
print(components)  // "["First", "Last"]\n"

1
@DarrellRoot bạn chỉ cần lập bản đồ các chuỗi confullName.split { $0.isWhitespace }.map(String.init)
Leo Dabus 18/07/19

2
Tôi thích API mới đó nhưng hãy nhớ rằng nó trả về Substrings. Tôi cần Chuỗi (và muốn phân tách trên khoảng trắng nói chung) vì vậy tôi đã làm điều này: let words = line.split{ $0.isWhitespace }.map{ String($0)} Cảm ơn @LeoDabus cho phiên bản của bạn (nhận xét ban đầu của tôi bị thiếu mã). Ngoài ra tôi đề nghị chuyển phiên bản Swift 5 lên đầu câu trả lời.
Rễ Darrell

53

Thay thế cho câu trả lời của WMios, bạn cũng có thể sử dụng componentsSeparatedByCharactersInSet, có thể hữu ích trong trường hợp bạn có nhiều dấu phân cách hơn (khoảng trắng, dấu phẩy, v.v.).

Với đầu vào cụ thể của bạn:

let separators = NSCharacterSet(charactersInString: " ")
var fullName: String = "First Last";
var words = fullName.componentsSeparatedByCharactersInSet(separators)

// words contains ["First", "Last"]

Sử dụng nhiều dấu phân cách:

let separators = NSCharacterSet(charactersInString: " ,")
var fullName: String = "Last, First Middle";
var words = fullName.componentsSeparatedByCharactersInSet(separators)

// words contains ["Last", "First", "Middle"]

2
Câu trả lời hữu ích nhất trong quan điểm của tôi, kể từ khi bạn có thể muốn cho phép tách các chuỗi với ,hoặc ;hoặc bất kỳ dấu phân cách khác
Chris

49

Swift 4

let words = "these words will be elements in an array".components(separatedBy: " ")

34

Vấn đề khoảng trắng

Nói chung, mọi người phát minh lại vấn đề này và các giải pháp xấu nhiều lần. Đây có phải là một không gian? "" Và những gì về "\ n", "\ t" hoặc một số ký tự khoảng trắng unicode mà bạn chưa từng thấy, trong một phần không nhỏ bởi vì nó là vô hình. Trong khi bạn có thể thoát khỏi

Một giải pháp yếu

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

Nếu bạn cần phải nắm bắt thực tế, hãy xem video WWDC theo chuỗi hoặc ngày. Nói tóm lại, hầu như luôn luôn tốt hơn khi cho phép Apple giải quyết loại nhiệm vụ trần tục này.

Giải pháp mạnh mẽ: Sử dụng NSCharacterset

Cách để thực hiện điều này một cách chính xác, IMHO, là sử dụng NSCharacterSetvì như đã nêu trước đó khoảng trắng của bạn có thể không phải là những gì bạn mong đợi và Apple đã cung cấp một bộ ký tự khoảng trắng. Để khám phá các bộ ký tự được cung cấp khác nhau, hãy xem tài liệu dành cho nhà phát triển NSCharacter Set của Apple và sau đó, chỉ sau đó, tăng hoặc xây dựng một bộ ký tự mới nếu nó không phù hợp với nhu cầu của bạn.

NSCharacterset whitespaces

Trả về một bộ ký tự có chứa các ký tự trong Unicode General Category Zs và 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
Đã đồng ý. Điều đầu tiên xảy ra với tôi sau khi thấy các câu trả lời được phân tách bằng "" là: Điều gì xảy ra nếu văn bản đầu vào chứa nhiều khoảng trắng liên tiếp? Nếu nó có các tab thì sao? Không gian toàn chiều rộng (CJK)? v.v.
Nicolas Miari

31

Trong Swift 4.2 và Xcode 10

//This is your str
let str = "This is my String" //Here replace with your string

lựa chọn 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!)

Lựa chọn 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)

Lựa chọn 3

let arr = str.split {$0 == " "}
print(arr)

Lựa chọn 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!"]"

Bằng Tài liệu 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 giúp phân chia ký tự dễ dàng hơn nhiều, chỉ cần sử dụng chức năng phân tách mới cho Chuỗi.

Thí dụ: let s = "hi, hello" let a = s.split(separator: ",") print(a)

Bây giờ bạn đã có một mảng với 'hi' và 'xin chào'.


Lưu ý rằng điều này không trả về một chuỗi Chuỗi, nhưng mảng Chuỗi con rất khó sử dụng.
Lirik

19

Cập nhật cho Swift 5 và cách đơn giản nhất

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: [",", " ", "!",".","?"])

Bản in này,

["Bob", "hit", "a", "ball", "", "the", "hit", "BALL", "flew", "far", "after", "it", "là "," hit "," "," Xin chào "," "," Hie "," "," Làm thế nào "," r "," u "," "]

Tuy nhiên, nếu bạn muốn lọc chuỗi trống,

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

Đầu ra,

["Bob", "hit", "a", "ball", "the", "hit", "BALL", "flew", "far", "after", "it", "was", " nhấn "," Xin chào "," Hie "," Làm thế nào "," r "," u "]

Nhưng hãy chắc chắn, Foundation được nhập khẩu


17

Swift 3

let line = "AAA    BBB\t CCC"
let fields = line.components(separatedBy: .whitespaces).filter {!$0.isEmpty}
  • Trả ba chuỗi AAA, BBBCCC
  • Lọc ra các trường trống
  • Xử lý nhiều khoảng trắng và ký tự lập bảng
  • Nếu bạn muốn xử lý các dòng mới, sau đó thay thế .whitespacesbằng.whitespacesAndNewlines

15

Cập nhật Swift 4, Xcode 10 và iOS 12 hoạt động 100%

let fullName = "First Last"    
let fullNameArr = fullName.components(separatedBy: " ")
let firstName = fullNameArr[0] //First
let lastName = fullNameArr[1] //Last

Xem tài liệu của Apple tại đây để biết thêm thông tin.


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

Đường dài:

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

Tôi đã có một kịch bản trong đó nhiều ký tự điều khiển có thể có trong chuỗi tôi muốn tách. Thay vì duy trì một mảng trong số này, tôi chỉ để Apple xử lý phần đó.

Các tính năng sau hoạt động với Swift 3.0.1 trên iOS 10:

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

8

Tôi tìm thấy một trường hợp thú vị, rằng

phương pháp 1

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

Khi tôi sử dụng lệnh này để phân tách một số biểu tượng từ dữ liệu được tải từ máy chủ , nó có thể phân tách trong khi thử nghiệm trong trình giả lập và đồng bộ hóa với thiết bị thử nghiệm, nhưng nó sẽ không phân tách trong ứng dụng xuất bản và Ad Hoc

Tôi mất rất nhiều thời gian để theo dõi lỗi này. Nó có thể bị nguyền rủa từ một số Phiên bản Swift, hoặc một số Phiên bản iOS hoặc không

Đây cũng không phải là về mã HTML, vì tôi đã cố gắng chuỗiByRemovingPercentEncoding và nó vẫn không hoạt động

thêm 10/10/2015

trong Swift 2.0 phương thức này đã được thay đổi thành

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

phương pháp 2

var data:[String] = featureData.componentsSeparatedByString("\u{003B}")

Khi tôi sử dụng lệnh này, nó có thể phân chia cùng một dữ liệu tải từ máy chủ


Kết luận, tôi thực sự đề nghị sử dụng phương pháp 2

string.componentsSeparatedByString("")

1
Tôi muốn nói rằng điều này gần với trạng thái "không phải là một câu trả lời", trong đó chủ yếu là bình luận về các câu trả lời hiện có. Nhưng nó đang chỉ ra một cái gì đó quan trọng.
gà trống

8

Hầu hết các câu trả lời đều cho rằng đầu vào chứa một khoảng trắng - không phải khoảng trắng và một khoảng trắng ở đó. Nếu bạn có thể đưa ra giả định đó một cách an toàn, thì câu trả lời được chấp nhận (từ bennett) khá thanh lịch và cũng là phương pháp tôi sẽ thực hiện khi có thể.

Khi chúng ta không thể đưa ra giả định đó, một giải pháp mạnh mẽ hơn cần phải giải quyết các vấn đề sau đây mà hầu hết các câu trả lời ở đây không xem xét:

  • tab / dòng mới / dấu cách (khoảng trắng), bao gồm các ký tự định kỳ
  • khoảng trắng hàng đầu
  • Apple / Linux ( \n)\r\nKý tự dòng mới Windows ( )

Để giải quyết các trường hợp này, giải pháp này sử dụng regex để chuyển đổi tất cả các khoảng trắng (bao gồm các ký tự dòng mới định kỳ và Windows) thành một khoảng trắng, cắt, sau đó phân tách bằng một khoảng trắng:

Swift 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

Hoặc không có đóng, bạn có thể làm điều này trong Swift 2:

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

6

Các bước để tách một chuỗi thành một mảng trong Swift 4.

  1. gán chuỗi
  2. dựa trên @ tách.

Lưu ý: biếnName.components (separBy: "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)

4

Swift 4

let string = "loremipsum.dolorsant.amet:"

let result = string.components(separatedBy: ".")

print(result[0])
print(result[1])
print(result[2])
print("total: \(result.count)")

Đầu ra

loremipsum
dolorsant
amet:
total: 3

3

Giả sử bạn có một biến có tên "Hello World" và nếu bạn muốn tách nó và lưu nó thành hai biến khác nhau, bạn có thể sử dụng như thế này:

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

2
let str = "one two"
let strSplit = str.characters.split(" ").map(String.init) // returns ["one", "two"]

Mã X 7.2 (7C68)


2

Swift 2.2 Xử lý lỗi & viết hoaString Đã thêm:

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

Xử lý chuỗi vẫn là một thách thức trong Swift và nó liên tục thay đổi đáng kể, như bạn có thể thấy từ các câu trả lời khác. Hy vọng mọi thứ lắng xuống và nó trở nên đơn giản hơn. Đây là cách để làm điều đó với phiên bản Swift 3.0 hiện tại với nhiều ký tự phân cách.

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)

2

Tôi đã tìm kiếm sự phân chia lỏng lẻo , chẳng hạn như PHP trong explodeđó các chuỗi trống được bao gồm trong mảng kết quả, điều này làm việc cho tôi:

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

Đầu ra:

["First", ""]

2

Điều này cung cấp cho một loạt các phần tách trực tiếp

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

sau đó bạn có thể sử dụng như thế này,

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

2

Chỉ có splitcâu trả lời đúng, đây là sự khác biệt cho hơn 2 khoảng trắng.

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"]

1

Điều này đã thay đổi một lần nữa trong bản Beta 5. Cuối tuần! Bây giờ nó là một phương thức trên CollectionType

Cũ:

var fullName = "First Last"
var fullNameArr = split(fullName) {$0 == " "}

Mới:

var fullName = "First Last"
var fullNameArr = fullName.split {$0 == " "}

Ghi chú phát hành Táo


1

Đối với 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

Đây là một thuật toán tôi vừa xây dựng, nó sẽ phân tách một Stringtừ bất kỳ Characterkhỏi mảng và nếu có bất kỳ mong muốn giữ các chuỗi con với các ký tự được tách, người ta có thể đặt swallowtham số 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
            }
        }
    }
}

Thí dụ:

"test text".splitBy([" "]) // ["test", "text"]
"test++text--".splitBy(["+", "-"], swallow: true) // ["test", "++" "text", "--"]
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.