Looping through all values between UInt8.min and UInt8.max


#1

I forgot to mention that I really would like to have i have type UInt8 within
the loop. And since i is UInt8 it makes sense it should be able to take the
values UInt8.min and UInt8.max (and all the values between).

8. Apr 2016 11:48 by swift-users@swift.org:

···

print(UInt8.min) //0

print(UInt8.max) //255

//Is there an easy way to loop between all values

//between (and including both) UInt8.min and UInt8.max?

//This doesn't work.

//Runtime crash because UInt8.max has no successor.

for i in UInt8.min...UInt8.max {

print\(i\)

}


(Peter Vertes) #2

You could cast the min and max values to an Int and iterate through the Int range:

let min = Int(UInt8.min)
let max = Int(UInt8.max)

for i in min...max {
    print(i)
}

While this will work it seems like a hack to me and Milos’ solution is more elegant…

-Pete

···

On Apr 8, 2016, at 5:50 AM, tuuranton--- via swift-users <swift-users@swift.org> wrote:

I forgot to mention that I really would like to have i have type UInt8 within the loop. And since i is UInt8 it makes sense it should be able to take the values UInt8.min and UInt8.max (and all the values between).

8. Apr 2016 11:48 by swift-users@swift.org <mailto:swift-users@swift.org>:

print(UInt8.min) //0

print(UInt8.max) //255

//Is there an easy way to loop between all values

//between (and including both) UInt8.min and UInt8.max?

//This doesn't work.

//Runtime crash because UInt8.max has no successor.

for i in UInt8.min...UInt8.max {

    print(i)

}

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


(Milos Rankovic) #3

Would this work for you?

extension UInt8 {
  var u: UInt { return UInt(self) }
}

for i in UInt8.min.u...UInt8.max.u {
  print(i)
}

milos

···

On 8 Apr 2016, at 10:50, tuuranton--- via swift-users <swift-users@swift.org> wrote:

I forgot to mention that I really would like to have i have type UInt8 within the loop. And since i is UInt8 it makes sense it should be able to take the values UInt8.min and UInt8.max (and all the values between).

8. Apr 2016 11:48 by swift-users@swift.org <mailto:swift-users@swift.org>:

print(UInt8.min) //0

print(UInt8.max) //255

//Is there an easy way to loop between all values

//between (and including both) UInt8.min and UInt8.max?

//This doesn't work.

//Runtime crash because UInt8.max has no successor.

for i in UInt8.min...UInt8.max {

    print(i)

}

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


#4

The problem with both solutions is that I lose the type information. Instead
of i being UInt8 it is Int or UInt.
This is one solution I came up with:
extension UInt8 { static var allValues: [UInt8] { var v: [UInt8] =
[] for i in 0..<UInt8.max { v.append(i) }
v.append(UInt8.max) return v }}
print(UInt8.allValues)
In other words, loop from 0 to 254 and then add 255 manually at the end.
Is there currently no simpler way to do this in Swift?
Idea for the Swift developers: Create a Bounded protocol that UInt8 (and the
other integer types) conform to. Then add a "allValues" type method in that
protocol. And also put .min and .max into that protocol. Currently it seems
like .min and .max are not a part of any particular protocol.

8. Apr 2016 14:35 by swift-users@swift.org:

···

You could cast the min and max values to an Int and iterate through the Int
range:
> min = > Int> (> UInt8> .min)> let> max = > Int> (> UInt8> .max)
> i > in> > min> ...> max> {> > print> (i)> }
While this will work it seems like a hack to me and Milos’ solution is more
elegant…
-Pete

On Apr 8, 2016, at 5:50 AM, tuuranton--- via swift-users <>> >> swift-users@swift.org>> > wrote:
          >> I forgot to mention that I really would like to have i have
type UInt8 within the loop. And since i is UInt8 it makes sense it should
be able to take the values UInt8.min and UInt8.max (and all the values
between).

8. Apr 2016 11:48 by >> swift-users@swift.org>> :

print(UInt8.min) //0

print(UInt8.max) //255

//Is there an easy way to loop between all values

//between (and including both) UInt8.min and UInt8.max?

//This doesn't work.

//Runtime crash because UInt8.max has no successor.

for i in UInt8.min...UInt8.max {

print\(i\)

}

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


(Milos Rankovic) #5

In that case, at least make it lazy:

let allUInt8s = UInt8.min.stride(through: UInt8.max, by: 1)

allUInt8s.dynamicType // StrideThrough<UInt8>.Type

Array(allUInt8s).count // 256

for i in allUInt8s {
  i // 0...255
}

milos

···

On 8 Apr 2016, at 13:48, tuuranton--- via swift-users <swift-users@swift.org> wrote:

The problem with both solutions is that I lose the type information. Instead of i being UInt8 it is Int or UInt.

This is one solution I came up with:

extension UInt8 {
    static var allValues: [UInt8] {
        var v: [UInt8] = []
        for i in 0..<UInt8.max {
            v.append(i)
        }
        v.append(UInt8.max)
        return v
    }
}

print(UInt8.allValues)

In other words, loop from 0 to 254 and then add 255 manually at the end.

Is there currently no simpler way to do this in Swift?

Idea for the Swift developers: Create a Bounded protocol that UInt8 (and the other integer types) conform to. Then add a "allValues" type method in that protocol. And also put .min and .max into that protocol. Currently it seems like .min and .max are not a part of any particular protocol.

8. Apr 2016 14:35 by swift-users@swift.org <mailto:swift-users@swift.org>:

You could cast the min and max values to an Int and iterate through the Int range:

let min = Int(UInt8.min)
let max = Int(UInt8.max)

for i in min...max {
    print(i)
}

While this will work it seems like a hack to me and Milos’ solution is more elegant…

-Pete

On Apr 8, 2016, at 5:50 AM, tuuranton--- via swift-users <swift-users@swift.org <mailto:swift-users@swift.org>> wrote:

I forgot to mention that I really would like to have i have type UInt8 within the loop. And since i is UInt8 it makes sense it should be able to take the values UInt8.min and UInt8.max (and all the values between).

8. Apr 2016 11:48 by swift-users@swift.org <mailto:swift-users@swift.org>:

print(UInt8.min) //0

print(UInt8.max) //255

//Is there an easy way to loop between all values

//between (and including both) UInt8.min and UInt8.max?

//This doesn't work.

//Runtime crash because UInt8.max has no successor.

for i in UInt8.min...UInt8.max {

    print(i)

}

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

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