在Swift中将String拆分为数组?

ble*_*908 653 arrays string split ios swift

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

var fullName: String = "First Last"
Run Code Online (Sandbox Code Playgroud)

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

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

var firstName: String = fullNameArr[0]
var lastName: String? = fullnameArr[1]
Run Code Online (Sandbox Code Playgroud)

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

Che*_*Lin 973

只需打电话componentsSeparatedByString给你fullName

import Foundation

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

var firstName: String = fullNameArr[0]
var lastName: String = fullNameArr[1]
Run Code Online (Sandbox Code Playgroud)

Swift 3+更新

import Foundation

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

let name    = fullNameArr[0]
let surname = fullNameArr[1]
Run Code Online (Sandbox Code Playgroud)

  • 这个答案适用于Xcode 7 beta 4和Swift 2.0.Xcode现在自动完成Swift String对象上的Foundation方法,而无需将类型转换为NSString,而Xcode 6.4与Swift 1.2不同. (6认同)
  • 需要注意的是,这实际上是一个基础`NSString`(Swift在导入`Foundation`时会自动交换它们). (3认同)
  • 在 Swift 1.2 中情况不再如此,Apple 不再自动将 Swift 的 String 转换为 NSString。 (2认同)
  • 这在Swift 2:Xcode 7中不起作用 (2认同)

Eth*_*han 763

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
Run Code Online (Sandbox Code Playgroud)

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 
Run Code Online (Sandbox Code Playgroud)

  • 在我的测试中,componentsSeparatedByString通常要快得多,特别是在处理需要拆分成多个部分的字符串时.但是对于OP列出的例子,要么就足够了. (98认同)
  • 请记住,如果分隔符长于单个字符,则仍需要使用旧的"componentsSeparatedByString()"方法.并且很遗憾地说`let(firstName,lastName)= split(fullName){$ 0 ==''}`,这是不可行的. (14认同)
  • 从Xcode 6.2b3开始,_split_可以用作`split("a:b :: c:",{$ 0 ==":"},maxSplit:Int.max,allowEmptySlices:false)`. (9认同)
  • 正确的Xcode 7.0代码是fullNameArr = fullName.characters.split {$ 0 ==""} .map(String.init).试图编辑,但它被拒绝了. (4认同)
  • @Kashif然后你可以使用`split("a,b; c,d"){$ 0 ==","|| $ 0 ==";"}`或`split("a,b; c,d"){contains(",;",$ 0)}` (3认同)
  • 任何人都知道如何拆分超过1个字符?例如`"."` (2认同)
  • 如何删除旧内容并仅显示当前答案。需要历史课程的人可以检查编辑历史。 (2认同)

Wye*_*tro 174

最简单的方法是使用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]
Run Code Online (Sandbox Code Playgroud)

对于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]
Run Code Online (Sandbox Code Playgroud)

  • @NRitH考虑`.componentsSeparatedByCharactersInSet(.whitespaceAndNewlineCharacterSet())` (9认同)

Lug*_*aue 119

Swift Dev.4.0(2017年5月24日)

splitSwift 4(Beta)中的新功能.

import Foundation
let sayHello = "Hello Swift 4 2017";
let result = sayHello.split(separator: " ")
print(result)
Run Code Online (Sandbox Code Playgroud)

输出:

["Hello", "Swift", "4", "2017"]
Run Code Online (Sandbox Code Playgroud)

访问值:

print(result[0]) // Hello
print(result[1]) // Swift
print(result[2]) // 4
print(result[3]) // 2017
Run Code Online (Sandbox Code Playgroud)

Xcode 8.1/Swift 3.0.1

这是多个分隔符与数组的方式.

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

输出:

["12", "37", "2", "5"]
Run Code Online (Sandbox Code Playgroud)

  • 确保将`import Foundation`添加到您正在使用它的类中.#SavedYouFiveMinutes (8认同)
  • 注意(Swift 4):如果你有一个像'let a ="a ,, b,c"`这样的字符串,你使用`a.split(separator:",")`你得到一个类似`["a"的数组,"b",c"]`默认情况下.这可以使用`omittingEmptySubsequences:false`来更改,默认情况下为true. (4认同)
  • Swift 4+中的任何多字符分割? (2认同)

Ant*_*nio 51

作为WMios答案的替代方案,您也可以使用componentsSeparatedByCharactersInSet,如果您有更多的分隔符(空格,逗号等),这可能很方便.

根据您的具体输入:

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

// words contains ["First", "Last"]
Run Code Online (Sandbox Code Playgroud)

使用多个分隔符:

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

// words contains ["Last", "First", "Middle"]
Run Code Online (Sandbox Code Playgroud)

  • 在我看来最有用的答案,因为您可能希望允许用`,`或`;`或任何其他分隔符分隔字符串 (2认同)

Leo*_*bus 51

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 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."
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • @DarrellRoot你只需要映射子字符串 `fullName.split { $0.isWhitespace }.map(String.init)` (4认同)
  • 我喜欢这个新的 API,但请记住它返回子字符串。我需要字符串(并且通常想在空格上分割),所以我这样做了: `let Words = line.split{ $0.isWhitespace }.map{ String($0)}` 感谢@LeoDabus 的版本(我原来的评论有代码缺失)。另外,我建议将 Swift 5 版本移至答案的顶部。 (2认同)

Bob*_*bby 49

斯威夫特4

let words = "these words will be elements in an array".components(separatedBy: " ")
Run Code Online (Sandbox Code Playgroud)


Cam*_*mer 31

空白问题

一般来说,人们一遍又一遍地重塑这个问题和糟糕的解决方案.这是一个空间吗?""以及"\n","\ t"或者你从未见过的一些unicode空白字符,在很大程度上是因为它是看不见的.虽然你可以逃脱

弱解决方案

import Foundation
let pieces = "Mary had little lamb".componentsSeparatedByString(" ")
Run Code Online (Sandbox Code Playgroud)

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

强大的解决方案:使用NSCharacterSet

正确使用恕我直言的方法是使用,NSCharacterSet因为如前所述,您的空白可能不是您所期望的,Apple提供了空白字符集.要浏览各种提供的字符集,请查看Apple的NSCharacterSet开发人员文档,然后,只有在它不符合您的需求时才会扩充或构造新的字符集.

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)
Run Code Online (Sandbox Code Playgroud)

  • 同意 在看到由“”分隔的答案之后,我想到的第一件事是:如果输入文本包含多个连续的空格会发生什么?如果有标签怎么办?全角(CJK)空间?等等 (2认同)

iOS*_*iOS 27

Swift 4.2和Xcode 10中

//This is your str
let str = "This is my String" //Here replace with your string
Run Code Online (Sandbox Code Playgroud)

选项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!)
Run Code Online (Sandbox Code Playgroud)

选项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)
Run Code Online (Sandbox Code Playgroud)

选项3

let arr = str.split {$0 == " "}
print(arr)
Run Code Online (Sandbox Code Playgroud)

选项4

通过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!"]"
Run Code Online (Sandbox Code Playgroud)


小智 21

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

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

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


小智 17

斯威夫特3

let line = "AAA    BBB\t CCC"
let fields = line.components(separatedBy: .whitespaces).filter {!$0.isEmpty}
Run Code Online (Sandbox Code Playgroud)
  • 返回三个字符串AAA,BBBCCC
  • 过滤掉空白字段
  • 处理多个空格和制表字符
  • 如果要处理新行,请替换.whitespaces.whitespacesAndNewlines


mis*_*don 15

只有split是正确答案,这里是 2 个以上空格的区别。

斯威夫特 5

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"]
Run Code Online (Sandbox Code Playgroud)


Xco*_*ngi 14

Swift 4,Xcode 10和iOS 12 Update 100%正常运行

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

有关详细信息,请参阅Apple的文档.


Nik*_*kaE 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
Run Code Online (Sandbox Code Playgroud)

很长的路要走:

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
Run Code Online (Sandbox Code Playgroud)


Cod*_*der 9

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

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

let myArray = myString.components(separatedBy: .controlCharacters)
Run Code Online (Sandbox Code Playgroud)


Sru*_*Suk 8

我发现了一个有趣的案例

方法1

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

当我使用此命令从服务器加载的数据中拆分某些符号时,它可以在模拟器中进行测试时拆分并与测试设备同步,但它不会在发布应用程序和Ad Hoc中拆分

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

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

新增10/10/2015

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

var data:[String] = featureData.split {$0 == "\u{003B}"}
Run Code Online (Sandbox Code Playgroud)

方法2

var data:[String] = featureData.componentsSeparatedByString("\u{003B}")
Run Code Online (Sandbox Code Playgroud)

当我使用此命令时,它可以拆分从服务器正确加载的相同数据


结论,我真的建议使用方法2

string.componentsSeparatedByString("")
Run Code Online (Sandbox Code Playgroud)


Mit*_*gam 8

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: [",", " ", "!",".","?"])
Run Code Online (Sandbox Code Playgroud)

打印,

[“鲍勃”,“命中”,“一个”,“球”,“”,“该”,“命中”,“球”,“飞”,“远”,“后”,“它”,“是“,” hit“,”“,” Hello“,”“,” Hie“,”“,” How“,” r“,” u“,”“]

但是,如果您要过滤出空字符串,

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

输出,

[“鲍勃”,“命中”,“一个”,“球”,“该”,“命中”,“球”,“飞”,“远”,“后”,“它”,“过去”,“ hit”,“ Hello”,“ Hie”,“ How”,“ r”,“ u”]

但是请确保基金会是进口的


Don*_*ghn 7

这些答案中的大多数都假设输入包含空格 - 而不是空白区域,以及单个空格.如果你可以安全地做出这个假设,那么接受的答案(来自bennett)是非常优雅的,也是我能用的方法.

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

  • tabs/newlines/spaces(空格),包括重复出现的字符
  • 前导/尾随空格
  • Apple/Linux(\n) Windows(\r\n)换行符

为了覆盖这些情况,此解决方案使用正则表达式将所有空格(包括重复和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"]
Run Code Online (Sandbox Code Playgroud)


Rau*_*ama 6

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

let fullName = "First Last"
let fullNameArr = fullName.characters.split(" ")
let firstName = String(fullNameArr[0])
Run Code Online (Sandbox Code Playgroud)


小智 6

在Swift 4中将字符串拆分为数组的步骤。

  1. 分配字符串
  2. 基于@分裂。

注意: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)
Run Code Online (Sandbox Code Playgroud)


Yod*_*ama 6

直接给出了一个分割部分的数组

var fullNameArr = fullName.components(separatedBy:" ")
Run Code Online (Sandbox Code Playgroud)

那么你可以像这样使用,

var firstName: String = fullNameArr[0]
var lastName: String? = fullnameArr[1]
Run Code Online (Sandbox Code Playgroud)


MrM*_*ins 5

斯威夫特 4

let string = "loremipsum.dolorsant.amet:"

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

print(result[0])
print(result[1])
print(result[2])
print("total: \(result.count)")
Run Code Online (Sandbox Code Playgroud)

输出

loremipsum
dolorsant
amet:
total: 3
Run Code Online (Sandbox Code Playgroud)


Nat*_*Day 5

最简单的解决方案是

let fullName = "First Last"

let components = fullName.components(separatedBy: .whitespacesAndNewlines).compactMap { $0.isEmpty ? nil : $0 }
Run Code Online (Sandbox Code Playgroud)

这将处理一行不同类型(空格、制表符、换行符等)中的多个空格,并且仅返回两个元素数组,您可以更改以CharacterSet包含更多您喜欢的字符,如果您想获得 cleaver,您可以使用 Regular表达式解码器,这使您可以编写可用于将解码字符串直接解码到您自己的实现解码协议的类/结构中的正则表达式。对于这样的事情来说有点过头了,但如果你用它作为更复杂的字符串的例子,它可能更有意义。