类型_的值无法转换为指定类型Set<>迅速

时间:2018-04-25 17:03:17

标签: swift swift4

我正在尝试创建一组随机练习。我已按照此处的教程https://medium.com/@JoyceMatos/hashable-protocols-in-swift-baf0cabeaebd制作了我的结构Hashable和Equatable,并且工作正常,因此可以将其放入Set<>。

当我使用阵列来收集锻炼练习时,如下所示,它可以正常工作。但当我切换到Set<>我收到一个错误“无法将类型[_]的值转换为指定的类型'Set'。'Sets'是什么意思是你无法以与数组相同的方式映射?

func generateWorkout() {
    let allPossibleExercises = masterExerciseArray
    let numberOfExercisesKey = Int(arc4random_uniform(4)+3)

//error triggers on the line below if I switch [WorkoutExercise]
//for Set<WorkoutExercise> (which conforms to Hashable/Equatable

let workoutSet : [WorkoutExercise] = (1...numberOfExercisesKey).map { _ in
        let randomKey = Int(arc4random_uniform(UInt32(allPossibleExercises.count)))

return WorkoutExerciseGenerator( name: allPossibleExercises[randomKey].name,
 maxReps: allPossibleExercises[randomKey].maxReps).generate()
    }
    print (workoutSet)
}

这里有一个类似错误消息Cannot convert value of type '[_]' to specified type 'Array'的答案,但我的数组不会像本例中那样是空的,所以我不认为这是根本原因?

更新:对于遇到相同问题的任何人,您可以使用Array,但如果正确的元素是Hashable / Equatable,则只需将Array转换为Set

1 个答案:

答案 0 :(得分:2)

如果创建数组,则创建数组,然后从数组中创建Set。如果所有涉及的对象都符合Hashable,那么这应该有效。

func generateWorkout() {
    let allPossibleExercises = masterExerciseArray
    let numberOfExercisesKey = Int(arc4random_uniform(4)+3)

    let workoutArray : [WorkoutExercise] = (1...numberOfExercisesKey).map { _ in
        let randomKey = Int(arc4random_uniform(UInt32(allPossibleExercises.count)))

        return WorkoutExerciseGenerator( name: allPossibleExercises[randomKey].name,
                                      maxReps: allPossibleExercises[randomKey].maxReps).generate()
    }
    let workoutSet = Set(workoutArray)
    print (workoutSet)
}