在Swift中添加地图到Range

时间:2015-08-06 19:22:05

标签: swift generics

我正在尝试使用与Range上类似的map函数扩展Array

extension Range {
    func map<T>(@noescape transform: (Element) -> T) -> [T] {
        var result = Array<T>()
        for i in self {
            result.append(transform(i))
        }
        return result
    }
}

ElementRange

定义
struct Range<Element : ForwardIndexType> : …

我认为这看起来相当不错,但是在使用它时我遇到编译错误:

let cellSubtitles: [String?] = {  // <-- Unable to infer closure type in the current context
    return 0...42.map {
        let week: Int = $0/7
        switch week {
        case 0:  return nil
        case 1:  return "Last Week"
        default: return "\(week) Weeks Ago"
        }
    }
}()

请注意,错误是针对周围的闭包,而不是传递给map的错误。

另外,将上面的第二行更改为

return (0...42 as Range<Int>).map {

摆脱了错误。

我不理解这一点,因为我的map函数在两种情况下都应返回[String?]。无论如何,我会假设0...42 Range<Int>也没有演员。

我正在使用Swift 2.0。

1 个答案:

答案 0 :(得分:6)

如果您使用的是Swift 2.0,那么map已为Range定义了Range,因为CollectionType符合实现map的{​​{1}},所以没有需要自己定义。