On Jul 5, 2016, at 1:25 PM, Martin R via swift-users <swift-users@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@swift.org
https://lists.swift.org/mailman/listinfo/swift-users