Swift版本的componentsSeparatedByString

Ant*_*hos 25 ios swift

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

var str = "Today is so hot"
var arr = str.componentsSeparatedByString(" ")  // *
Run Code Online (Sandbox Code Playgroud)
  • 我知道它不起作用,但我正在寻找那样的.我想用""(或另一个字符串/字符串)拆分字符串

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

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

Mar*_*n R 32

如果要按给定字符拆分字符串,则可以使用内置split()方法,而无需使用Foundation:

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

更新Swift 1.2:使用Swift 1.2(Xcode 6.3)更改参数的顺序,比较split现在抱怨缺少"isSeparator":

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

Swift 2更新:请参阅Stuart的回答.

Swift 3更新:

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

  • 正如@The Paramagnetic Croiss所提到的,这项工作在基金会开箱即用.你需要更多的吻...(保持简单的愚蠢).componentsSeparatedByString正是它所说的只是把正确的字符,事件空间工作! (3认同)

Stu*_*art 18

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

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

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

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

 解释速记初始化表达式(map(String.init))

map是一个接受函数作为参数的方法.大多数情况下,您可能只使用尾随闭包(一个未命名的函数)作为参数map,例如:

func createString(from character: Character) -> String {
    // ...
}

let strings = characters.map { createString(from: $0) }
Run Code Online (Sandbox Code Playgroud)

但以下内容更简洁,同样有效:

let strings = characters.map(createString(from:))
// or even:
let strings = characters.map(createString) // argument names inferred from context.
Run Code Online (Sandbox Code Playgroud)

在上述例子中,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 {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

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


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