[swift-users] Cannot invoke 'stride' with an argument list of type '(from: Int, to: Int, by: Int)'

Martin R martinr448 at gmail.com
Tue Jul 5 12:25:00 CDT 2016


It seems that the extension method

    extension Strideable {
        public func stride(to end: Self, by stride: Self.Stride) -> StrideTo<Self>
    }

from Swift 2.2 is still known to the compiler and only marked as unavailable in Swift 3, as this code example demonstrates:

    extension Int {
        func test() {
            for _ in stride(to: 10, by: 2) { }
            // error: 'stride(to:by:)' is unavailable: Use stride(from:to:by:) free function instead
        }
    }

so that in your code

    extension Int {
        func up(to upper: Int, by step: Int = 1, _ closure: @noescape () -> Void) {
            for _ in stride(from: self, to: upper, by: step) {
                closure()
            }
        }
    }

the compiler tries to match the stride() invocation against this (unavailable) extension method. This is also confirmed by the compiler messages:

    error: cannot invoke 'stride' with an argument list of type '(from: Int, to: Int, by: Int)'
    note: overloads for 'stride' exist with these partially matching parameter lists: (to: Self, by: Self.Stride), (through: Self, by: Self.Stride)

This would also explain why it fails to compile in an extension to Int or Float, but compiles without errors in an extension to String or other non-Strideable types.

As a workaround, you can call the global function by explicitly prefixing it with the module name "Swift":

    extension Int {
        func up(to upper: Int, by step: Int = 1, _ closure: @noescape () -> Void) {
            for _ in Swift.stride(from: self, to: upper, by: step) {
                closure()
            }
        }
    }

Regards, Martin

> You are right. Int conforms to Strideable.
> 
> Now it seams like a bug. As in a playground. below are code works and
> doesn't work
> 
> extension Int {
> 
>     func test() {
> 
>         let temp = stride(from:1, to:10, by:2) // error
> 
>     }
> 
> }
> 
> 
> extension Float {
> 
>     func test() {
> 
>         let temp = stride(from:1, to:10, by:2) // error
> 
>     }
> 
> }
> 
> 
> extension String {
> 
>     func test() {
> 
>         let temp = stride(from:1, to:10, by:2) // works
> 
>     }
> 
> }
> 
> 
> class A {
> 
> 
> 
> }
> 
> 
> extension A {
> 
>     func test() {
> 
>         let temp = stride(from:1, to:10, by:2) // works
> 
>     }
> 
> }
> 
> 
> struct B {
> 
> 
> 
> }
> 
> 
> extension B {
> 
>     func test() {
> 
>         let temp = stride(from:1, to:10, by:2) // works
> 
>     }
> 
> }
> 
> 
> func test() {
> 
>     let temp = stride(from:1, to:10, by:2) //works
> 
> }
> 
> 
> let temp = stride(from:1, to:10, by:2) // works
> 
> 
> ​It is nothing bug a bug?​
> 
> 
> ​Zhaoxin​
> 
> 
> 
> On Tue, Jul 5, 2016 at 10:16 PM, Shawn Erickson <shawnce at gmail.com> wrote:
> 
> > Int conforms to Strideable byway of Integer <- SignedInteger <- Int (not
> > exactly sure how it will be once the integer proposal is implemented but it
> > will still be strideable).
> >
> > -Shawn
> >
> > On Mon, Jul 4, 2016 at 10:38 PM Zhao Xin via swift-users <
> > swift-users at swift.org> wrote:
> >
> >> In Swift 3,
> >>
> >> func stride<T : Strideable>(from start: T, to end: T, by stride:
> >> T.Stride) -> StrideTo<T>
> >>
> >> Int does not conform to Strideable.
> >>
> >> Adopted By
> >>
> >> CGFloat
> >> Decimal
> >> Double
> >> Float
> >> Float80
> >> String.UTF16View.Index
> >> UnsafeMutablePointer
> >> UnsafePointer
> >>
> >> ​In Swift 2.2,
> >>
> >> @warn_unused_result func stride(to *end*: Self, by *stride*: Self.Stride)
> >> -> StrideTo<Self>
> >>
> >> It uses Self, which means the type of the variable, instead of T.
> >>
> >> Zhaoxin
> >>
> >> On Tue, Jul 5, 2016 at 11:41 AM, Adriano Ferreira via swift-users <
> >> swift-users at swift.org> wrote:
> >>
> >>> Hi everyone!
> >>>
> >>> I’m converting some code to Swift 3 and got this issue?
> >>>
> >>>
> >>>
> >>>
> >>> Does anybody know what’s going on?
> >>>
> >>> Here’s the code, before and after conversion:
> >>>
> >>>
> >>> // Swift 2.2
> >>> extension Int {
> >>>
> >>>     // Repeat a block of code from `self` up to a limit
> >>>     func up(to upper: Int, by step: Int = 1, @noescape closure: () ->
> >>> Void) {
> >>>
> >>>         for _ in self.stride(to: upper, by: step) {
> >>>             closure()
> >>>         }
> >>>     }
> >>> }
> >>>
> >>> // Swift 3
> >>> extension Int {
> >>>
> >>>     // Repeat a block of code from `self` up to a limit
> >>>     func up(to upper: Int, by step: Int = 1, _ closure: @noescape () ->
> >>> Void) {
> >>>
> >>>         for _ in stride(from: self, to: upper, by: step) {
> >>>             closure()
> >>>         }
> >>>     }
> >>> }
> >>>
> >>>
> >>> // Usage
> >>> 1.up(to: 10, by: 2) {
> >>>     print("Hi!")
> >>> }
> >>>


More information about the swift-users mailing list