首页 文章

Swift:将String拆分为数组

提问于
浏览
571

说我在这里有一个字符串:

var fullName: String = "First Last"

我想在白色空间上拆分字符串,并将值分配给它们各自的变量

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

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

此外,有时用户可能没有姓氏 .

30 回答

  • 91

    Swift 3

    let line = "AAA    BBB\t CCC"
    let fields = line.components(separatedBy: .whitespaces).filter {!$0.isEmpty}
    
    • 返回三个字符串 AAABBBCCC

    • 过滤掉空白字段

    • 处理多个空格和制表字符

    • 如果要处理新行,则将 .whitespaces 替换为 .whitespacesAndNewlines

  • 1

    我发现了一个有趣的案例

    method 1

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

    当我使用此命令拆分某些符号 from the data that loaded from server 时,它可以在模拟器中进行测试时拆分并与测试设备同步,但它不会在发布应用程序和Ad Hoc中拆分

    我花了很多时间来跟踪这个错误,它可能会受到一些Swift版本或某些iOS版本的诅咒,或者两者兼而有之

    它也不是关于HTML代码,因为我尝试使用stringByRemovingPercentEncoding并且它仍然不起作用

    addition 10/10/2015

    在Swift 2.0中,此方法已更改为

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

    method 2

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

    当我使用此命令时, it can split the same data that load from server correctly


    Conclusion, I really suggest to use the method 2

    string.componentsSeparatedByString("")
    
  • 2

    As per Swift 2.2

    您只需编写2行代码即可获得拆分字符串 .

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

    请享用 . :)

  • 713

    假设您有一个名为“Hello World”的变量,如果您想将其拆分并将其存储到两个不同的变量中,您可以像这样使用:

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

    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.namePrefix   // Mr.
        nameComps.givenName    // Steven
        nameComps.middleName   // Paul
        nameComps.familyName   // Jobs
        nameComps.nameSuffix   // Jr.
    
        // 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."
    }
    
  • 855

    希望这是有帮助的

    Swift 4: Split a String into an array. Step 1: assign string. step 2: based on @ spliting. Note: 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)
    
  • 2

    我还没有找到能够处理具有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)
    }
    
  • 6

    Swift 4使得分割字符变得更加容易,只需使用字符串的新分割功能 .

    示例: let s = "hi, hello" let a = s.split(separator: ",") print(a)

    现在你有一个'hi'和'hello'的数组 .

  • 37

    我有一个场景,我想要拆分的字符串中可以存在多个控制字符 . 我没有维护这些数组,而是让Apple处理这一部分 .

    以下适用于iOS 10上的Swift 3.0.1:

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

    最简单的方法是使用componentsSeparatedBy:

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

    For 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]
    
  • 46

    或者没有闭包你可以在Swift 2中做到这一点:

    let fullName = "First Last"
    let fullNameArr = fullName.characters.split(" ")
    let firstName = String(fullNameArr[0])
    
  • 13
    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"

  • 0

    对于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]
    
  • 24

    作为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"]
    
  • 8

    字符串处理在Swift中仍然是一个挑战,它会不断变化,正如您可以从其他答案中看到的那样 . 希望事情能够安定下来并且变得更加简单 . 这是使用当前3.0版本的Swift和多个分隔符进行此操作的方法 .

    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

    Swift Dev. 4.0 (May 24, 2017)

    Swift 4中的新函数 splitBeta ) .

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

    这些答案中的大多数都假设输入包含空格 - 而不是 white 空格,并且在该空间处有一个空格 . 如果你可以安全地做出这个假设,那么接受的答案(来自bennett)是非常优雅的,也是我能用的方法 .

    当我们无法做出这样的假设时,一个更强大的解决方案需要涵盖以下大多数答案不考虑的问题:

    • tabs / newlines / spaces(空格),包括 recurring 个字符

    • 前导/尾随空格

    • Apple / Linux( \nand 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"]
    
  • 1

    我正在寻找松散的分裂,例如PHP的 explode ,其中空序列包含在结果数组中,这对我有用:

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

    Output:

    ["First", ""]
    
  • 12

    空白问题

    一般来说,人们一遍又一遍地重塑这个问题和糟糕的解决方案 . 这是一个空间吗? “”和“你”之前的“\ n”,“\ t”或一些unicode空白字符有什么关系,这在很大程度上是因为它是看不见的 . 虽然你可以逃脱

    一个弱的解决方案

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

    如果您需要动摇现实,请观看有关字符串或日期的WWDC视频 . 简而言之,几乎总是更好允许Apple解决这种平凡的任务 .

    强大的解决方案:使用NSCharacterSet

    正确地执行此操作的方法,恕我直言,是使用 NSCharacterSet ,因为如前所述,您的空白可能不是您所期望的,Apple提供了空白字符集 . 要探索各种提供的字符集,请查看Apple的NSCharacterSet developer documentation,然后,只有在不符合您需要的情况下,才会扩充或构造新的字符集 .

    NSCharacterSet空格

    返回包含Unicode General Category 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)
    
  • 0

    只需在 fullName 上调用 componentsSeparatedByString 方法

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

    Update for Swift 3+

    import Foundation
    
    let fullName    = "First Last"
    let fullNameArr = fullName.components(separatedBy: " ")
    
    let name    = fullNameArr[0]
    let surname = fullNameArr[1]
    
  • 2

    Swift 4, Xcode 10 and iOS 12 Update 100% working

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

    有关详细信息,请参阅Apple's documentation here .

  • 8

    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
    
  • 1
    let str = "one two"
    let strSplit = str.characters.split(" ").map(String.init) // returns ["one", "two"]
    

    Xcode 7.2 (7C68)

  • 1

    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
    
  • 3

    这已经在Beta 5中再次改变了.Weee!它现在是CollectionType上的一个方法

    旧:

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

    新:

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

    Apples Release Notes

  • 8

    Swift 2.2 Error Handling & capitalizedString 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
    }
    
  • 8

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

    Output

    loremipsum
    dolorsant
    amet:
    total: 3
    
  • 7

    在Swift 4.2和Xcode 10中

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

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

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

    Option 3

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

    Option 4

    By Apple Documentation....

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

    Swift 4

    let words = "these words will be elements in an array".components(separatedBy: " ")
    
  • 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", "--"]
    

相关问题