[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