我知道它的noob问题,我真的在搜索之前搜索。但对于我想知道的内容并没有确切的答案。 我们如何在不使用Objective C的情况下将字符串拆分为数组?例如:
var str = "Today is so hot"
var arr = str.componentsSeparatedByString(" ") // *
想法:对我来说可能非常好,扩展了字符串类。但我不知道我是怎么做到的。
编辑:忘记导入基础。如果我导入基础它将工作。但是有没有办法扩展String类? 谢谢
答案 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"
}
}
}
}