使用变量作为 arc4random 的下限 - 显式 type/strideable?

Using variable as lower bound for arc4random - explicit type/strideable?

)

我更新了 "Workout Object" 以同时设置最小和最大重复次数。

当我在操场上对下界进行硬编码时,我一直在使用:

let numberOfExercises = Int(arc4random_uniform(4) + 3)

当我尝试在 function/with a class 对象中使用变量时,出现错误“+'不可用:请使用显式类型转换或 Strideable 方法进行混合类型算术”例如这里...

class ExerciseGeneratorObject: Object {
    @objc dynamic var name = ""
    @objc dynamic var minReps = 0
    @objc dynamic var maxReps = 0    

    convenience init(name: String, minReps: Int, maxReps: Int) {
        self.init()
        self.name = name
        self.minReps = minReps
        self.maxReps = maxReps
    }

    func generateExercise() -> WorkoutExercise {
        return WorkoutExercise(
            name: name,
//get error on this line...
            reps: Int(arc4random_uniform(UInt32(maxReps))+minReps)
        )
    }
}

此处有答案,但该方法已在使用,因此看不到它在此处的适用性。

也在这里 '+' is deprecated: Mixed-type addition is deprecated in Swift 3.1 但再次认为这是一个不同的问题

'+' is unavailable: Please use explicit type conversions or Strideable methods for mixed-type arithmetics.

示例:

let a: UInt32 = 4
let b = 3

let result = a + b //error

基本上意味着你不能添加混合类型


在您执行 arc4random_uniform(UInt32(maxReps)) + minRepsarc4random_uniform() returns 的情况下,UInt32 无法添加到 minReps,因为那是 Int.

解决方案:

更新括号:

let numberOfExercises = Int(arc4random_uniform(UInt32(maxReps))) + minReps

这里 Int(arc4random_uniform(UInt32(maxReps))) 给出了一个 Int 我们可以添加到 minReps Int.


顺便说一句,以下是开箱即用的:

let numberOfExercises = Int(arc4random_uniform(4) + 3)

因为Swift的自动类型推断。基本上它只是继续 UInt32 而不会打扰你。那就是......直到你给它明确的混合类型。