ForEach takes an @escaping closure with 1 argument. Since you're not using $0 anywhere, the compiler thinks you're supplying closure with 0 argument and is confused. If you really are not using the loop number, you can just do:
ForEach(1..<noOfShapes, id: \.self) { _ in
...
}
Though I think you might be mixing up some logic.
Another, since the closure is escape, all properties you used inside it needs to be explicitly marked as escape*, or use self.. That is, if you're using shapeType, shadingType, shapeColor, size, noOfShapes, strokeWidth, radiusValue inside that closure, you need to say self.shapeType, self.shadingType, etc. Or you can add it to the capture list:
ForEach(...) { [shapeType = self.shapeType] _ in
}
Though note that values in the capture list is just a copy of the original data.
It's actually amazing that you can type all that before hitting both of these errors.
* After SE-0269, ie, after Swift 5.3, you can omit self. if self is a value type (struct, enum), or if you simply capture self.
PS
Here are some resources about escaping closure and shorthand argument name.