我正在尝试使用与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
}
}
Element
由Range
:
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。
答案 0 :(得分:6)
如果您使用的是Swift 2.0,那么map
已为Range
定义了Range
,因为CollectionType
符合实现map
的{{1}},所以没有需要自己定义。