Is the following a compiler bug or am I doing something wrong:
protocol Subscriptable {
associatedtype Element
associatedtype Index
var firstIndex: Index { get }
var lastIndex: Index { get }
subscript(index: Index) -> Element { get set }
}
struct AnySubscriptable<E, I>: Subscriptable {
typealias Element = E
typealias Index = I
let firstIndexee: () -> I
let lastIndexee: () -> I
let subscriptee: (index: I) -> E
let setSubscriptee: (index: I, element: E) -> Void
var firstIndex: I { return firstIndexee() }
var lastIndex: I { return lastIndexee() }
subscript(index: I) -> E {
get { return subscriptee(index: index) }
set { setSubscriptee(index: index, element: newValue) }
}
}
extension Array {
var asScriptable: AnySubscriptable<Element, Int> {
return AnySubscriptable(
firstIndexee: { return self.startIndex }, // Error: Cannot convert `() -> Int` to expected `() -> _`
lastIndexee: { return self.endIndex },
subscriptee: { return self[$0] },
setSubscriptee: { self[$0] = $1 }
)
}
}
The error, "Cannot convert () -> Int
to expected () -> _
", on the firstIndexee
closure in the extension is strange because:
- The type is correct
- There is no error on
lastIndexee
- If
set
is removed fromsubscript
inSubscriptable
, and hencesetSubscriptee
etc. inAnySubscriptable
and in the extension, then the error goes away.
Compiler bug or my mistake?
Thanks in advance for any help,
-- Howard.