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

Adriano Ferreira adriano.ferreira at me.com
Tue Jul 5 13:39:10 CDT 2016


Thanks Martin, now it works!

Do you think this should be filed as a bug or just wait until the Swift team removes the old stride method?

Best,

— A

> On Jul 5, 2016, at 1:25 PM, Martin R via swift-users <swift-users at swift.org> wrote:
> 
> 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!")
>>>>> }
>>>>> 
> _______________________________________________
> swift-users mailing list
> swift-users at swift.org
> https://lists.swift.org/mailman/listinfo/swift-users



More information about the swift-users mailing list