Классы являются ссылочными типами, поэтому, как вы заметили, все элементы массива в
var users = [User](count: howManyUsers, repeatedValue:User(thinkTime: 10.0))
ссылаются на один и тот же экземпляр объекта (который создается первым, а затем передается как аргумент инициализатору массива).
Для типа struct
вы получите другой результат.
Возможное решение:
var users = (0 ..< howManyUsers).map { _ in User(thinkTime: 10.0) }
Здесь создается экземпляр User
для каждого из индексов массива.
Если вам это нужно часто, вы можете определить метод инициализации массива, который принимает параметр «автозакрытия»:
extension Array {
public init(count: Int, @autoclosure elementCreator: () -> Element) {
self = (0 ..< count).map { _ in elementCreator() }
}
}
var users = Array(count: howManyUsers, elementCreator: User(thinkTime: 10.0) )
Теперь второй аргумент User(thinkTime: 10.0)
завершается компилятором в закрытие, а закрытие выполняется для каждого индекса массива.
Обновление для Swift 3:
extension Array {
public init(count: Int, elementCreator: @autoclosure () -> Element) {
self = (0 ..< count).map { _ in elementCreator() }
}
}