我想在字符串上运行过滤器。我的第一次尝试失败,因为字符串没有自动转换为Character []。
var s: String = "abc"
s.filter { $0 != "b" }
如果我使用以下代码将String笨拙地转换为Character [],它将按预期工作。但肯定有一个更简洁的方式吗?
var cs:Character[] = []
for c in s {
cs = cs + [c]
}
cs = cs.filter { $0 != "b" }
println(cs)
答案 0 :(得分:5)
String
符合CollectionType
协议,因此您可以直接将其传递给map
和filter
的函数形式,而无需转换它:
let cs = filter(s) { $0 != "f" }
cs
这里是Array
的{{1}}。您可以使用Character
初始值设定项将其转换为String
,初始值设定项可以从String(seq:)
个String
构建SequenceType
。 (Character
是所有列表符合的协议; SequenceType
循环使用它们,以及许多其他内容。)
for
当然,您可以轻松地将这两件事放在一个陈述中:
let filteredString = String(seq: cs)
或者,如果您想使用let filteredString = String(seq: filter(s) { $0 != "f" })
上的便捷filter
方法,则可以使用扩展程序:
Array
(你把它写成“Swift.filter”,所以编译器不认为你试图以递归方式调用你当前正在编写的extension String {
func filter(includeElement: Character -> Bool) -> String {
return String(seq: Swift.filter(self, includeElement))
}
}
方法。)
只要我们隐藏了如何执行过滤,我们也可以使用惰性filter
,这应该避免构建临时数组:
filter
答案 1 :(得分:1)
我不知道有一种内置方法可以做到,但你可以为String编写自己的过滤方法:
extension String {
func filter(f: (Character) -> Bool) -> String {
var ret = ""
for character in self {
if (f(character)) {
ret += character
}
}
return ret
}
}
如果您不想使用扩展程序,可以执行此操作:
Array(s).filter({ $0 != "b" }).reduce("", combine: +)
答案 2 :(得分:1)
您可以使用以下语法:
var chars = Character[]("abc")
我不能100%确定结果是否是Character
的数组,但适用于我的用例。
var str = "abc"
var chars = Character[](str)
var result = chars.map { char in "char is \(char)" }
result
答案 3 :(得分:0)
将char转换为字符串的最简单方法是使用反斜杠(),例如我有一个函数来反转字符串,就像这样。
var identityNumber:String = id
for char in identityNumber{
reversedString = "\(char)" + reversedString
}