在Swift中将String转换为[Character]的最佳方法是什么?

时间:2014-06-08 23:36:52

标签: swift

我想在字符串上运行过滤器。我的第一次尝试失败,因为字符串没有自动转换为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)

4 个答案:

答案 0 :(得分:5)

String符合CollectionType协议,因此您可以直接将其传递给mapfilter的函数形式,而无需转换它:

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
}