在SequenceType中的For循环中转换条目?

时间:2015-05-06 16:52:58

标签: ios swift

进行以下循环:

for entry in entries {
   println("entry: \(entry)")
}

我想将循环头中的条目强制转换为String。我不能执行以下操作,因为它不是数组:

for entry in entries as! [String] {
}

因为条目不是数组。

编辑:条目符合SequenceType协议。

如何将循环标题中的条目转换为String?

2 个答案:

答案 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)
}