我正在尝试创建一组随机练习。我已按照此处的教程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
答案 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)
}