Swift-də bir dizəyə bir simli bölmək?

Gəlin bir xətt var:

 var fullName: String = "First Last" 

Dəmir bazasını bir məkana ayırmaq və onların dəyişənlərinə dəyərlər təyin etmək istəyirəm.

 var fullNameArr = // something like: fullName.explode(" ") var firstName: String = fullNameArr[0] var lastName: String? = fullnameArr[1] 

Bundan əlavə, bəzən istifadəçilər bir soyadına sahib ola bilməzlər.

580
05 сент. set blee908 05 sentyabr. 2014-09-05 06:51 '14 da 6:51 2014-09-05 06:51
@ 32 cavab
  • 1
  • 2

Swift metodu - qlobal split funksiyasından istifadə edin, məsələn:

 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 ilə

Swift 2-də split istifadə edərək, daxili CharacterView tipinin tətbiqi ilə əlaqədar bir az daha mürəkkəb olur. Bu, String artıq SequenceType və ya CollectionType protokollarını istifadə edir və String nümunəsinin CharacterView-ə daxil olmaq üçün .characters xüsusiyyətindən istifadə .characters . (Qeyd: CharacterView SequenceType və CollectionType protokollarını istifadə edir.)

 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 
719
09 окт. Cavab Ethan 09 oktyabr verilir . 2014-10-09 08:06 '14 at 8:06 2014-10-09 08:06

Yalnız componentsSeparatedByString fullName metodu fullName

 import Foundation var fullName: String = "First Last" let fullNameArr = fullName.componentsSeparatedByString(" ") var firstName: String = fullNameArr[0] var lastName: String = fullNameArr[1] 
border=0

Swift 3+ üçün yeniləmə

 import Foundation let fullName = "First Last" let fullNameArr = fullName.components(separatedBy: " ") let name = fullNameArr[0] let surname = fullNameArr[1] 
878
05 сент. Chen-Tsu Lin tərəfindən verilmiş cavab 05 Sep 2014-09-05 07:12 '14 saat 07:12 AM 2014-09-05 07:12

Bunu etmək üçün en asan yol, AyrarlanmışBy komponentlərini istifadə etməkdir:

Swift 2 üçün:

 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 üçün:

 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] 
159
05 сент. Cavab WMios verilir. 2014-09-05 07:09 '14 da 7:09 2014-09-05 07:09

Swift Dev. 4.0 (24 may, 2017)

Swift 4-də ( Beta ) yeni split funksiyası.

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

Nəticə:

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

Qiymətlərə giriş:

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

Xcode 8.1 / Swift 3.0.1

Bir neçə array məhdudlaşdırıcı var.

 ["12", "37", "2", "5"] 
96
21 нояб. cavab LugiHaue 21 noyabr verilir . 2016-11-21 21:12 '16 saat 21:12 'də 2016-11-21 21:12

WMios cavabına alternativ olaraq, daha çox ayırıcıya (boşluq, virgül, və s.) Malik olmağınız üçün yararlı ola biləcək componentsSeparatedByCharactersInSet olanSeparatedByCharactersInSet də istifadə edə bilərsiniz.

Xüsusi girişinizlə:

 let separators = NSCharacterSet(charactersInString: " ") var fullName: String = "First Last"; var words = fullName.componentsSeparatedByCharactersInSet(separators) // words contains ["First", "Last"] 

Bir neçə məhdudlaşdırıcı istifadə:

 let separators = NSCharacterSet(charactersInString: " ,") var fullName: String = "Last, First Middle"; var words = fullName.componentsSeparatedByCharactersInSet(separators) // words contains ["Last", "First", "Middle"] 
48
05 сент. Cavab Antonio tərəfindən verildi. 2014-09-05 09:42 '14 da 9:42 2014-09-05 09:42

Swift 4

 let words = "these words will be elements in an array".components(separatedBy: " ") 
44
12 июня '17 в 23:38 2017-06-12 23:38 Cavab Bobby tərəfindən 12 İyun '17' də 23:38 2017-06-12 23:38 'də verilir

Xcode 9 Swift 4 və ya Xcode 8.2.1 • Swift 3.0.2

Yalnız şəxsin adını düzgün biçimlendirmeniz lazımdırsa, PersonNameComponentsFormatter istifadə edə bilərsiniz.

PersonNameComponentsFormatter sinfi, PersonNameComponents obyekti tərəfindən təmsil olunan şəxsin adının komponentlərinin lokal görünüşlərini təmin edir. Bir şəxsin adını bir istifadəçiyə göstərdikdə lokalizə edilmiş adlar yaratmaq üçün bu sinfi istifadə edin.


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

2019

10 янв. Leo Dabus tərəfindən 10 yanvarda verilən cavab 2015-01-10 01:50 '15 at 1:50 'də 2015-01-10 01:50

Space bar

Bir qayda olaraq, insanlar bu problemi və pis qərarları bir daha təkrarlayırlar. Bu yer mi? "" və görünməz olduğundan "\ n", "\ t" və ya görmədiyiniz bəzi unicode boşluq xarakterləri haqqında nə qədər böyük ölçüdədir. Bəli, uzaqlaşa bilərsiniz

Zəif həll

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

Əgər həqiqətdən silkələsəniz, WWDC videolarını strings və ya tarixi ilə izləyə bilərsiniz. Bir sözlə, Apple bu dünyəvi tapşırıqları həll etməyə imkan verəcək.

Etibarlı həll: NSCharacterSet istifadə edin

Bunu düzgün etmək üçün IMHO, NSCharacterSet dən istifadə NSCharacterSet çünki əvvəllər qeyd edildiyi kimi, boşluqlarınız gözlənilməz ola bilər və Apple boşluq şəklində bir xarakter qurdu. Təmin edilən müxtəlif xarakterli kəşfləri araşdırmaq üçün, Apple NSCharacterSet geliştirici sənədlərini nəzərdən keçirin və sonra yalnız ehtiyaclarınıza cavab vermirsə yeni bir kətə əlavə edin və ya yaradın .

Spaces NSCharacterSet

Unicode General Kateqoriya Zs və CHARACTER TABULATION (U + 0009) simvolları olan bir simvol dəstini qaytarır.

 let longerString: String = "This is a test of the character set splitting system" let components = longerString.components(separatedBy: .whitespaces) print(components) 
24
01 янв. Cavab Cameron Louell Palmer tərəfindən verilir 01 yanvar. 2016-01-01 23:34 '16 at 23:34 2016-01-01 23:34

Swift 4 simvolların ayrılmasını asanlaşdırır, yalnız strings üçün yeni ayırma funksiyasından istifadə edin.

Məsələn: let s = "hi, hello" let a = s.split(separator: ",") print(a)

İndi salam və salam ilə bir sıra var.

20
07 июня '17 в 20:21 2017-06-07 20:21 Cavab Jeroen Zonneveld tərəfindən 07 İyun 07: 20-21: 2017-06-07 20:21 tarixində verilir

Swift 3

 let line = "AAA BBB\t CCC" let fields = line.components(separatedBy: .whitespaces).filter {!$0.isEmpty} 
  • AAA , BBBCCC üç strings qaytarır
  • Boş sahələri süzün
  • Bir çox boşluq və nişanı idarə edir
  • Yeni xətləri idarə etmək istəyirsinizsə, .whitespaces ilə .whitespacesAndNewlines əvəz .whitespacesAndNewlines
14
16 сент. Tepl tərəfindən verilmiş cavab 16 Sep. 2017-09-16 22:36 '17 saat 10:36 'da 2017-09-16 22:36

Xcode 8.0 / Swift 3

 let fullName = "First Last" var fullNameArr = fullName.components(separatedBy: " ") var firstname = fullNameArr[0] // First var lastname = fullNameArr[1] // Last 

Uzun yol:

 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 
12
04 нояб. Cavab NikaE 04 noyabr tarixində verilir. 2016-11-04 22:29 '16 saat 10:29 'da 2016-11-04 22:29

Swift 4.2 və Xcode 10-da

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

Seçim 1

 let items = str.components(separatedBy: " ")//Here replase space with your value and result is Array. //Direct 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!) 

Seçim 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) 

Seçim 3

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

Seçim 4

Apple sənədlərinə görə ...

 let line = "BLANCHE: I don't want realism. I want magic!" print(line.split(separator: " ")) print(line.split(separator: " ", maxSplits: 1))//This can split your string into 2 parts 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. 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)) 
11
17 сент. Cavab iOS 17 sentyabrda verilir. 2018-09-17 09:57 '18 saat 09:57 2018-09-17 09:57

Mən maraqlı bir vəziyyət tapdım

üsulu 1

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

Bu əmri serverdən endirilən məlumatlara bölmək üçün istifadə edərkən simulyatorda test zamanı bölüşdürülə bilər və test cihazı ilə sinxronizasiya edə bilər, lakin tətbiq nəşriyyatına bölünməyəcək və Ad Hoc

Bu səhvəni izləmək üçün çox vaxt lazımdır, Swift-in bəzi versiyalarından və ya iOS-un bəzi versiyasından lənətlənə bilər

StringByRemovingPercentEncoding etməyə çalışıram və hələ də işləmirəm, çünki bu da HTML kodu deyil

əlavə 10/10/2015

Swift 2.0 bu metodu dəyişdi

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

üsul 2

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

Bu əmri istifadə edərkən serverdən yüklənmiş eyni məlumatları düzgün paylaşa bilər.


Nəticə, həqiqətən 2 üsulundan istifadə etməyi təklif edirəm

 string.componentsSeparatedByString("") 
8
12 марта '15 в 15:11 2015-03-12 15:11 Sert A.Sukun 12 mart 'da 15:11' də verdiyi cavabı 2015-03-12 15:11

Swift 4, Xcode 10 və iOS 12 Update 100% işləyir

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

Əlavə məlumat üçün Apple sənədlərinə baxın .

8

Bu cavabların əksəriyyəti girişin bir boş yerə malik olduğunu göstərir - yer və bir yer yoxdur. Təhlükəsiz bu fərziyyəni edə bilərsiniz, onda qəbul cavab (bennett dən) olduqca zərifdir, həm də mümkün olduğunca çalışacağam üsuldur.

Bu fərziyyəni edə bilməyəcəyiksə, daha etibarlı bir həll aşağıdakı cavabları əhatə etməlidir, əksəriyyəti cavablar burada nəzərə alınmır:

  • nişanlar / yeni satırlar / boşluqlar (boşluqlar), o cümlədən təkrarlanan simvollar
  • aparıcı / ardıcıl boşluqlar
  • Apple / Linux ( \n ) Windows-un yeni simvolları ( \r\n )

Bu halları əhatə etmək üçün bu həll bütün boşluqları (duplicate characters və yeni Windows xətti simvol daxil olmaqla) bir yerə bölüşdürmək, sonra bir yerə bölmək üçün regex istifadə edir:

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"] 
7
21 июня '16 в 14:45 2016-06-21 14:45 Cavab DonVaughn tərəfindən 21 İyun, '16 'də saat 14:45' də 2016-06-21 14:45 'də verilir

Yoxsa, bağlanmadan, yalnız Swift 2-də bunu edə bilərsiniz:

 let fullName = "First Last" let fullNameArr = fullName.characters.split(" ") let firstName = String(fullNameArr[0]) 
6
11 сент. Cavab Rauli Rikama tərəfindən verilir . 2015-09-11 07:46 '15 at 7:46 AM 2015-09-11 07:46

Bu faydalıdır

Swift 4: simli bir dizəyə bölün. Addım 1: simli atayın. Addım 2: @spliting əsasında. Qeyd: variableName.components (ayrılan: "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) 
3
02 мая '18 в 11:35 2018-05-02 11:35 cavab Vidhyapathi Kandhasamy tərəfindən verilir 02 May '18 da 11:35 2018-05-02 11:35
 let str = "one two" let strSplit = str.characters.split(" ").map(String.init) // returns ["one", "two"] 

Xcode 7.2 (7C68)

2
07 апр. Cavab Amr Lotfy Apr 07 2016-04-07 11:12 '16 'da 11:12' də 2016-04-07 11:12

Diyelim ki, "Hello World" adlı bir dəyişən var və onu ayırmaq və iki fərqli dəyişənə saxlamaq istəyirsinizsə, bu şəkildə istifadə edə bilərsiniz:

 var fullText = "Hello World" let firstWord = fullText.text?.components(separatedBy: " ").first let lastWord = fullText.text?.components(separatedBy: " ").last 
2
02 мая '18 в 15:55 2018-05-02 15:55 Cavab Parf Barot tərəfindən verilir 02 May '18 saat 15:55 2018-05-02 15:55

Swift 2.2 Error handling və capedString Added:

 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
02 июня '16 в 15:38 2016-06-02 15:38 cavab 02 iyun 'da 15:38' də 2016-06-02 15:38 ' də Aqib Mumtaz tərəfindən verilir

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

Çıxın

 loremipsum dolorsant amet: total: 3 
1
31 июля '18 в 1:54 2018-07-31 01:54 cavab 31 may 18: 00-da 1:54 2018-07-31 01:54 tarixində Mrmins tərəfindən verilir

Swift 2.2'ye görə

Siz sadəcə 2 satırlıq kod yazırsınız və bir bölmə xəttinə sahibsiniz.

 let fullName = "FirstName LastName" var splitedFullName = fullName.componentsSeparatedByString(" ") print(splitedFullName[0]) print(splitedFullName[1]) 

Enjoy.

1
26 апр. 26 apreldə Gautam Sareriya tərəfindən verilmiş cavab 2016-04-26 17:21 '16 saat 5:21 'də 2016-04-26 17:21

Tez 2, Xcode 7.1 üçün:

 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
01 окт. cavab 01 oktyabr ayına qədər verilir . 2015-10-01 09:19 '15 'da saat 09:19' da, 2015-10-01 09:19

Boş boşluqlar axtarırdıq, məsələn, PHP explode nəticədə ardıcıl sətirlər daxil olur, mənim üçün işləyirdi:

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

Çıxış:

 ["First", ""] 
1
18 авг. Cavab AamirR 18 aug tərəfindən verilir . 2018-08-18 13:15 '18 saat 13:15 'də 2018-08-18 13:15

String işlənməsi hələ də Swift-də problemdir və digər cavablardan da göründüyü kimi, bu, əhəmiyyətli dərəcədə dəyişməyə davam edir. Ümid edirəm hər şey susur və daha asan olur. Bunu bir neçə ayırıcı simvolu ilə Swift-ın 3.0 versiyasını hazırlamaq üsuludur.

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) 
1
13 апр. cavab verə bilər 13 Apr 2017-04-13 22:03 '17 saat 10:03 ' da 2017-04-13 22:03

Yenə 5-də dəyişdi. Weee! İndi bu CollectionType-də bir üsuldur

Köhnə:

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

Yeni:

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

Apple Release Qeydlər

1
07 авг. Daniel H. tərəfindən verilmiş cavab 07 avqust 2015-08-07 23:16 '15 saat 23:16 'de, 2015-08-07 23:16

İşdə yaradan alqoritm, bir String hər hansı bir Character bir String pozur və ayrı-ayrı simvollarla alt daşı saxlamaq istəyirsinizsə, swallow parametrini true olaraq təyin edə bilərsiniz.

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  { substring.append(character) } } } else  { 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 } } } } 

Məsələn:

 "test text".splitBy([" "]) // ["test", "text"] "test++text--".splitBy(["+", "-"], swallow: true) // ["test", "++" "text", "--"] 
1
09 мая '16 в 21:10 2016-05-09 21:10 Cavab DevAndArtist tərəfindən 09 may 16:16 saat 21:10 2016-05-09 21:10 tarixində verilir

3 və ya daha çox komponentlə adları idarə edən və iOS-un köhnə versiyasını dəstəkləyən bir həll tapmadım.

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

Test vəziyyətləri tamamlandı:

 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) } 
0
12 июля '17 в 12:26 2017-07-12 12:26 cavab Vadim Bulavin 12 iyul, '17 'saat 12:26 2017-07-12 12:26' də verilir
 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" 
  • Eyni ilk və son adını ləğv edin
  • Tam adı etibarsızdırsa, "John Doe" dəyərini daxil edin,
0
09 апр. Cavab jnblanchard 09 apr tərəfindən verilir . 2018-04-09 19:38 '18 saat 07:38 'da 2018-04-09 19:38
  • 1
  • 2

Tags bağlı digər suallar və ya bir sual