Swift版本的componentsSeparatedByString

时间:2014-08-10 08:40:36

标签: ios swift

我知道它的noob问题,我真的在搜索之前搜索。但对于我想知道的内容并没有确切的答案。 我们如何在不使用Objective C的情况下将字符串拆分为数组?例如:

var str = "Today is so hot"
var arr = str.componentsSeparatedByString(" ")  // *
  • 我知道它不起作用,但我正在寻找这样的。我想用"分割字符串。 " (或其他字符/字符串)

想法:对我来说可能非常好,扩展了字符串类。但我不知道我是怎么做到的。

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

4 个答案:

答案 0 :(得分:32)

如果要按给定的字符分割字符串,则可以使用 内置split()方法,无需基础:

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 now complains about missing "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's answer

Swift 3的更新:

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

答案 1 :(得分:18)

在Swift 2中,它的语法更加简洁。顶级split函数现在是CollectionType上的一种方法(String.CharacterView符合)。

该方法有两个版本,第一个采用闭包作为谓词来指示给定元素是否应该被视为分隔符,而另一个只需要一个元素来指定作为分隔符 - 这很可能是你的意思想要99%的字符串拆分。它们都有一些默认参数(详见文档),这有助于保持方法调用的良好和清晰。

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

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

解释速记初始化表达式(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都是函数表达式map期望函数作为参数,函数表达式可以作为参数传递。您可以在接受函数作为参数的任何位置传递函数表达式,这就是为什么您可以对符合sort的类型使用Comparable这样的类型:

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初始化表达式。它可以像函数表达式一样使用 - 它本身描述了一个函数,它将一个Character作为参数,并返回一个String类型的值(尽管String.init重载,可以传递许多不同类型的参数。)

为了帮助澄清发生了什么,请考虑以下代码,其中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)

答案 2 :(得分:8)

在Swift 3.0中  在字符串上使用components(separatedBy:)而不是componentsSeparatedByString

分享代码示例

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

答案 3 :(得分:1)

  

&#34;我知道它不起作用&#34;

嗯,对我来说,确实如此。在Swift REPL:

  1> import Foundation
  2> "a b c".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"
      }
    }
  }
}