Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays Swift:创建具有不同对象实例的默认值的数组_Arrays_Swift_Initialization_Instance_Instantiation - Fatal编程技术网

Arrays Swift:创建具有不同对象实例的默认值的数组

Arrays Swift:创建具有不同对象实例的默认值的数组,arrays,swift,initialization,instance,instantiation,Arrays,Swift,Initialization,Instance,Instantiation,我注意到在创建一个带有默认值的数组时有点奇怪(而且很危险)。如中所述 Swift的数组类型还提供了一个初始值设定项,用于创建一个特定大小的数组,并将其所有值设置为相同的默认值。将要添加到新数组中的项数(称为计数)和相应类型的默认值(称为repeatedValue)传递给此初始值设定项: 要点是:相同的默认值;为了理解它是如何工作的,我尝试创建这个示例类的元素数组 class User { private struct Shared { static var sequence: Int

我注意到在创建一个带有默认值的数组时有点奇怪(而且很危险)。如中所述

Swift的数组类型还提供了一个初始值设定项,用于创建一个特定大小的数组,并将其所有值设置为相同的默认值。将要添加到新数组中的项数(称为计数)和相应类型的默认值(称为repeatedValue)传递给此初始值设定项:

要点是:相同的默认值;为了理解它是如何工作的,我尝试创建这个示例类的元素数组

class User {
  private struct Shared {
    static var sequence: Int = 0
  }

  var id: Int
  var thinkTime: NSTimeInterval // typealias di Double

  init (thinkTime: NSTimeInterval) {
    User.Shared.sequence = User.Shared.sequence+1
    id = User.Shared.sequence
    self.thinkTime = thinkTime
  }
}
这个测试代码:

let  howManyUsers: Int = 3
var users = [User](count: howManyUsers, repeatedValue:User(thinkTime: 10.0))
let u2: User = User(thinkTime: 10)
let u3: User = User(thinkTime: 10)
users.append(u2)
users.append(u3)
users[1].thinkTime = 20
users[3].thinkTime = 30

for u in users {
  print("User id:\(u.id) thinktime:\(u.thinkTime)")
}
给出:

User id:1 thinktime:20.0     
User id:1 thinktime:20.0
User id:1 thinktime:20.0
User id:2 thinktime:30.0
User id:3 thinktime:10.0
使用要添加到新数组中的项数和适当类型的默认值来确定初始值设定项:相同的对象实例


这是一种尽可能简洁和智能的方法,可以获得一个使用相同默认值(不是同一个实例,而是许多使用相同默认值初始化的实例)的不同对象实例数组。

类是引用类型,因此,正如您所注意到的,所有数组 元素

var users = [User](count: howManyUsers, repeatedValue:User(thinkTime: 10.0))
引用相同的对象实例(先创建,然后 作为参数传递给数组初始值设定项)

对于
struct
类型,您将得到不同的结果

一种可能的解决办法:

var users = (0 ..< howManyUsers).map { _ in 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() }
    }
}
扩展数组{
public init(count:Int,elementCreator:@autoclosure()->Element){
self=(0..
Swift 5

extension MSRoom {
    static var dummyDefaultRoom: MSRoom = {
        let members = MSRoom.Member.dummyMembers(maxCount: 6)
        let ownerUser = members.first!.user
        var room = MSRoom(id: "98236482724", info: .init(name: "Ahmed's Room", description: "your default room", isPrivate: true), owner: ownerUser)
        room.dateCreated = Date(timeIntervalSince1970: 1565222400)
        room.currentMembers = members
        return room
    }()

}

let rooms = [MSRoom](repeating: MSRoom.dummyDefaultRoom, count: 10)
extension MSRoom {
    static var dummyDefaultRoom: MSRoom = {
        let members = MSRoom.Member.dummyMembers(maxCount: 6)
        let ownerUser = members.first!.user
        var room = MSRoom(id: "98236482724", info: .init(name: "Ahmed's Room", description: "your default room", isPrivate: true), owner: ownerUser)
        room.dateCreated = Date(timeIntervalSince1970: 1565222400)
        room.currentMembers = members
        return room
    }()

}

let rooms = [MSRoom](repeating: MSRoom.dummyDefaultRoom, count: 10)