在Swift中添加地图到Range

fab*_*789 3 generics swift

我正在尝试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
    }
}
Run Code Online (Sandbox Code Playgroud)

Element定义如下Range:

struct Range<Element : ForwardIndexType> : …
Run Code Online (Sandbox Code Playgroud)

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

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"
        }
    }
}()
Run Code Online (Sandbox Code Playgroud)

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

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

return (0...42 as Range<Int>).map {
Run Code Online (Sandbox Code Playgroud)

摆脱错误.

我不明白这一点,因为我的map函数应该[String?]在两种情况下都返回.而且不管怎么说,我会认为0...42Range<Int>还没有投.

我正在使用Swift 2.0.

mlu*_*own 6

如果您使用的是Swift 2.0,那么map已经定义了,Range因为它Range符合CollectionType,实现了map,所以不需要自己定义它.