componentSeparatedByString的Swift版本

我知道它的noob问题,我真的search前询问。 但是,我不知道我想知道的确切答案。 我们如何将string拆分成数组而不使用Objective C? 例如:

var str = "Today is so hot" var arr = str.componentsSeparatedByString(" ") // * 
  • 我知道这是行不通的,但我正在寻找那样的。 我想用“”(或另一个字符/string)拆分string

想法:这对我来说可能是非常好的,可以扩展string类。 但我不知道我是怎么做到的。

编辑:忘记导入基础。 如果我import基础它将工作。 但有没有办法扩展string类? 谢谢

如果你想通过一个给定的字符来分割string,那么你可以使用内build的split()方法,而不需要Foundation:

 let str = "Today is so hot" let arr = split(str, { $0 == " "}, maxSplit: Int.max, allowEmptySlices: false) println(arr) // [Today, is, so, hot] 

更新Swift 1.2:参数的顺序随着Swift 1.2(Xcode 6.3)而改变,比较split现在抱怨缺less“isSeparator” :

 let str = "Today is so hot" let arr = split(str, maxSplit: Int.max, allowEmptySlices: false, isSeparator: { $0 == " "} ) println(arr) // [Today, is, so, hot] 

Swift 2更新:请参阅Stuart的答案 。

Swift 3的更新:

 let str = "Today is so hot" let arr = str.characters.split(separator: " ").map(String.init) print(arr) 

在Swift 2中,这个语法更加简洁。 顶级split函数现在是一个CollectionTypeString.CharacterView符合)的方法。

这个方法有两个版本,第一个把闭包作为谓词来表示一个给定的元素是否应该作为分隔符,另一个是简单地把一个元素指定为分隔符 – 这可能是你想要的99 %string拆分。 他们都有一些默认的参数(请参阅文档的详细信息),这有助于保持方法调用的好和清晰。

值得注意的是, split(_:)返回一个SubSequence (基本上是一个Slice ),所以在大多数情况下需要转换回一个String数组,这通常更有用。

 let str = "Today is so hot" let words = str.characters.split(" ").map { String($0) } // or `.map(String.init)` 

解释简写初始值expression式( map(String.init)

map是一个接受函数作为参数的方法。 大多数时候,你可能只是使用尾随闭包(一个未命名的函数)作为map的参数,例如:

 func createString(from character: Character) -> String { // ... } let strings = characters.map { createString(from: $0) } 

但下面更简洁,也是一样有效的:

 let strings = characters.map(createString(from:)) // or even: let strings = characters.map(createString) // argument names inferred from context. 

在上面的例子中, createString(from:)createString都是函数expression式map需要一个函数作为参数,并且一个函数expression式可以作为该parameter passing。 你可以在任何接受函数的地方传递一个函数expression式作为参数,这就是为什么你可以像这样对符合Comparable的types进行sort

 let sortedStrings = strings.sorted(by: <) // `<` is just a function expression for a function that is essentially declared something like this: func <(lhs: String, rhs: String) -> Bool { // ... } 

String.init是一个初始化expression式 。 它可以像函数expression式一样使用 – 它本身描述一个函数,它将一个Character作为参数,并返回一个Stringtypes的值(尽pipeString.init被重载并且可以被传递多种types的论点)。

为了帮助理清发生了什么,请考虑以下代码,其中每次调用map都完全相同,但使用的语法越来越简洁:

 // - Closure expression syntax used. // - Explicit argument names & types. // - Long-hand string initialization. let strings = characters.map({ (character: CharacterView) -> String in return String.init(character) }) // - Trailing closure syntax used (parentheses omitted). // - Closure argument and return types inferred from context (type names omitted). // - Short-hand (standard, really) string initialization. let strings = characters.map { character in return String(character) } // - Implicit return since using single expression in the closure (`return` keyword omitted). let strings = characters.map { character in String(character) } // - Shorthand argument names (`in` keyword and argument names omitted). let strings = characters.map { String($0) } // - Initializer expression syntax used (curly braces omitted, argument implicitly passed to the initializer). let strings = characters.map(String.init(_:)) // - Initializer expression argument names inferred from context. let strings = characters.map(String.init) 

在Swift 3.0中使用string比componentsSeparatedByString components(separatedBy:)

共享代码示例

 let tempString = "1.Wash your hands\n2.Check you phone\n3.Click home button".components(separatedBy: "\n") print(tempString) 

“我知道这是行不通的”

那么,对我来说,它呢。 在Swift REPL中:

  1> import Foundation 2> "abc".componentsSeparatedByString(" ") $R6: String[] = size=3 { [0] = { core = { _baseAddress = Builtin.RawPointer = 0x0000000100407980 _countAndFlags = -4611686018427387903 _owner = Some { Some = @"a" } } } [1] = { core = { _baseAddress = Builtin.RawPointer = 0x0000000100408e50 -> 0x00007fff7cde0062 (void *)0x001b00007fff7cdd _countAndFlags = -4611686018427387903 _owner = Some { Some = @"b" } } } [2] = { core = { _baseAddress = Builtin.RawPointer = 0x0000000100408dd0 _countAndFlags = -4611686018427387903 _owner = Some { Some = @"c" } } } }