Strange type error


(Howard Lovatt) #1

HI,

Does anyone know what is happening here:

protocol Subscriptable {

    associatedtype Element

    associatedtype Index

    var firstIndex: Index { get }

    var lastIndex: Index { get }

    subscript(index: Index) -> Element { get set }

}

struct AllSubscriptable<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: AllSubscriptable<Element, Int> {

        return AllSubscriptable(

            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 is very strange since the types are correct and the
same as `lastIndexee` which does not have an error.

Also if the set subscript in Subscriptable and then all the other set
support in AnySubscriptabe and in the extension is removed, then no error.

Any clues to why?

-- Howard.


(Zhao Xin) #2

You protocol is not defined properly.

···

On Mon, Mar 21, 2016 at 7:08 AM, Howard Lovatt via swift-users < swift-users@swift.org> wrote:

HI,

Does anyone know what is happening here:

protocol Subscriptable {

    associatedtype Element

    associatedtype Index

    var firstIndex: Index { get }

    var lastIndex: Index { get }

    subscript(index: Index) -> Element { get set }

}

struct AllSubscriptable<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: AllSubscriptable<Element, Int> {

        return AllSubscriptable(

            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 is very strange since the types are correct and the
same as `lastIndexee` which does not have an error.

Also if the set subscript in Subscriptable and then all the other set
support in AnySubscriptabe and in the extension is removed, then no error.

Any clues to why?

-- Howard.

_______________________________________________
swift-users mailing list
swift-users@swift.org
https://lists.swift.org/mailman/listinfo/swift-users


(Howard Lovatt) #3

Hi,

I don't understand your comment, can you explain some more please?

Thanks,

-- Howard.

···

On Monday, 21 March 2016, zh ao <owenzx@gmail.com> wrote:

You protocol is not defined properly.

On Mon, Mar 21, 2016 at 7:08 AM, Howard Lovatt via swift-users < > swift-users@swift.org > <javascript:_e(%7B%7D,'cvml','swift-users@swift.org');>> wrote:

HI,

Does anyone know what is happening here:

protocol Subscriptable {

    associatedtype Element

    associatedtype Index

    var firstIndex: Index { get }

    var lastIndex: Index { get }

    subscript(index: Index) -> Element { get set }

}

struct AllSubscriptable<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: AllSubscriptable<Element, Int> {

        return AllSubscriptable(

            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 is very strange since the types are correct and the
same as `lastIndexee` which does not have an error.

Also if the set subscript in Subscriptable and then all the other set
support in AnySubscriptabe and in the extension is removed, then no error.

Any clues to why?

-- Howard.

_______________________________________________
swift-users mailing list
swift-users@swift.org
<javascript:_e(%7B%7D,'cvml','swift-users@swift.org');>
https://lists.swift.org/mailman/listinfo/swift-users

--
-- Howard.


(zhigang) #4

It might have something to do with

`setSubscriptee`

with seems from the implementation is a `mutating` operation.

If you comment it out, or just give it a empty callback, it will pass
compile.

Kyle

···

On Tue, Mar 22, 2016 at 6:23 AM Howard Lovatt via swift-users < swift-users@swift.org> wrote:

Hi,

I don't understand your comment, can you explain some more please?

Thanks,

-- Howard.

On Monday, 21 March 2016, zh ao <owenzx@gmail.com> wrote:

You protocol is not defined properly.

On Mon, Mar 21, 2016 at 7:08 AM, Howard Lovatt via swift-users < >> swift-users@swift.org> wrote:

HI,

Does anyone know what is happening here:

protocol Subscriptable {

    associatedtype Element

    associatedtype Index

    var firstIndex: Index { get }

    var lastIndex: Index { get }

    subscript(index: Index) -> Element { get set }

}

struct AllSubscriptable<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: AllSubscriptable<Element, Int> {

        return AllSubscriptable(

            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 is very strange since the types are correct and the
same as `lastIndexee` which does not have an error.

Also if the set subscript in Subscriptable and then all the other set
support in AnySubscriptabe and in the extension is removed, then no error.

Any clues to why?

-- Howard.

_______________________________________________
swift-users mailing list
swift-users@swift.org
https://lists.swift.org/mailman/listinfo/swift-users

--
-- Howard.
_______________________________________________
swift-users mailing list
swift-users@swift.org
https://lists.swift.org/mailman/listinfo/swift-users


(zhigang) #5

You can not mutate a array itself in a

`var asScriptable`

you might be able to accomplish such with a function.

struct AllSubscriptable<E, Index> {
    let setSubscriptee: (index: Index, element: E) -> Void
}
extension Array {
    mutating func asScriptable() -> AllSubscriptable<Element, Int> {
        func sub(key:Int, element: Element) {
                self[key] = element
        }
        return AllSubscriptable<Element, Int>(
            setSubscriptee: sub
        )
    }
}

Kyle

···

On Fri, Mar 25, 2016 at 2:50 PM zhigang <zhigang1992@gmail.com> wrote:

It might have something to do with

`setSubscriptee`

with seems from the implementation is a `mutating` operation.

If you comment it out, or just give it a empty callback, it will pass
compile.

Kyle

On Tue, Mar 22, 2016 at 6:23 AM Howard Lovatt via swift-users < > swift-users@swift.org> wrote:

Hi,

I don't understand your comment, can you explain some more please?

Thanks,

-- Howard.

On Monday, 21 March 2016, zh ao <owenzx@gmail.com> wrote:

You protocol is not defined properly.

On Mon, Mar 21, 2016 at 7:08 AM, Howard Lovatt via swift-users < >>> swift-users@swift.org> wrote:

HI,

Does anyone know what is happening here:

protocol Subscriptable {

    associatedtype Element

    associatedtype Index

    var firstIndex: Index { get }

    var lastIndex: Index { get }

    subscript(index: Index) -> Element { get set }

}

struct AllSubscriptable<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: AllSubscriptable<Element, Int> {

        return AllSubscriptable(

            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 is very strange since the types are correct and the
same as `lastIndexee` which does not have an error.

Also if the set subscript in Subscriptable and then all the other set
support in AnySubscriptabe and in the extension is removed, then no error.

Any clues to why?

-- Howard.

_______________________________________________
swift-users mailing list
swift-users@swift.org
https://lists.swift.org/mailman/listinfo/swift-users

--
-- Howard.
_______________________________________________
swift-users mailing list
swift-users@swift.org
https://lists.swift.org/mailman/listinfo/swift-users