ios - index - swift substring




Swift:將一個字符串拆分成一個數組 (18)

說我在這裡有一個字符串:

var fullName: String = "First Last"

我想在空白處分割字符串,並將值分配給它們各自的變量

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

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

另外,有時用戶可能沒有姓氏。


空白問題

一般來說,人們一遍又一遍地徹底改變了這個問題和糟糕的答案 這是一個空間嗎? “”以及“\ n”,“\ t”或一些你從未見過的unicode空格字符,這在很大程度上是因為它是不可見的。 雖然你可以逃避

弱解決方案

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

如果您需要動搖現實,請觀看WWDC上的字符串或日期視頻。 總之,允許Apple解決這種平凡的任務總是比較好。

強大的解決方案:使用NSCharacterSet

正確地做到這一點,恕我直言,是使用NSCharacterSet因為如前所述,您的空白可能不是您所期望的,Apple提供了一個空白字符集。 為了探索各種提供的字符集,請查看Apple的NSCharacterSet開發人員文檔 ,然後才能添加或構建新的字符集(如果它不符合您的需要)。

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使分割字符變得更加容易,只需使用Strings的新分割函數即可。

例:

let s = "hi, hello"
s.split(separator: ",")

現在你有一個'嗨'和'你好'的數組。


最簡單的方法是使用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]

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
}

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

Xcode 9 Swift 4Xcode 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.givenName    // Steven
    nameComps.middleName   // Paul
    nameComps.familyName   // Jobs
    nameComps.nameSuffix   // Jr.
    nameComps.namePrefix   // Mr.

    // It can also be convufgured 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."
}


斯威夫特4

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

根據Swift 2.2

你只需寫2行代碼,你會得到拆分字符串。

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

請享用。 :)


假設你有一個名為“Hello World”的變量,如果你想分割它並將它存儲到兩個不同的變量中,你可以像這樣使用它:

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

只需在你的fullName上調用componentsSeparatedByString方法即可

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]

對於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]

希望這是有幫助的

Swift 4:將一個字符串分解成一個數組。 第1步:分配字符串。 第2步:基於@ spliting。 注意:variableName.components(separatedBy:“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)

我發現了一個有趣的案例

方法1

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

當我使用此命令從服務器加載的數據中拆分某個符號時,它可以在模擬器中測試並與測試設備同步時拆分,但它不會拆分為發布應用程序,並且Ad Hoc

這需要我花很多時間來跟踪這個錯誤,它可能會被一些Swift版本或者某些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("")

我還沒有找到解決方案來處理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)
}

這些答案中的大多數假設輸入包含一個空間 - 而不是空白空間,並且包含一個空格。 如果你能夠安全地做出這樣的假設,那麼接受的答案(來自貝內特)就非常優雅,而且我會盡可能地採用這種方法。

當我們不能做出這樣的假設時,一個更強大的解決方案需要覆蓋以下大部分答案都沒有考慮到的以下問題:

  • 選項卡/換行符/空格(空白),包括重複出現的字符
  • 前/後空白
  • Apple / Linux( \n Windows( \r\n )換行符

為了涵蓋這些情況,此解決方案使用正則表達式將所有空白(包括循環和Windows換行符)轉換為單個空格,修剪,然後拆分一個空格:

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

這已經在Beta 5中再次改變了。Weee! 它現在是一個CollectionType的方法

舊:

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

新:

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

蘋果發行說明


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

Xcode 7.2(7C68)


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"
  • 禁止相同的姓氏和名字
  • 如果完整名稱無效,請發生佔位符值“John Doe”




split