进行以下循环:
for entry in entries {
println("entry: \(entry)")
}
我想将循环头中的条目强制转换为String。我不能执行以下操作,因为它不是数组:
for entry in entries as! [String] {
}
因为条目不是数组。
编辑:条目符合SequenceType
协议。
如何将循环标题中的条目转换为String?
答案 0 :(得分:2)
有地图; - )
let entries = NSSet(array: ["Foo", "Bar"])
for entry in map(entries, {$0 as! String}) {
println("entry: \(entry)")
}
希望有所帮助
答案 1 :(得分:1)
" easy"解决方案是
for x in entries {
if let y = x as? String {
println(y)
}
}
但这可能不是你想要的。
如果可以接受首先创建所有元素的数组 那么以下内容也会起作用:
let a = Array(entries)
for x in a as! [String] {
println(x)
}
如果entries
是产生AnyObject
元素的序列,那么
知道所有这些元素实际上都是字符串,然后就可以了
使用
String
s的新序列
let stringSeq = SequenceOf { () -> GeneratorOf<String> in
var gen = entries.generate()
return GeneratorOf {
return gen.next() as? String
}
}
for x in stringSeq {
println(x) // x is a `String`
}
你可能应该做的是改变。的定义
entries
生成器本身,以便它首先生成字符串。示例(基于您之前的代码
问题Make Class iterable with a for in Loop?和this博客文章):
// Class containing an array of `AnyObject`:
class MyArrayClass {
var array: [AnyObject] = ["a", "b", "c"]
}
// Sequence producing `String`:
extension MyArrayClass : SequenceType {
func generate() -> GeneratorOf<String> {
var index = 0
return GeneratorOf {
if index < self.array.count {
return self.array[index++] as? String
} else {
return nil
}
}
}
}
// Now the enumeration gives strings:
let entries = MyArrayClass()
for x in entries {
println(x)
}