当前位置: 首页 > 面试题库 >

Swift:使用不同对象实例的默认值创建一个数组

郑浩博
2023-03-14
问题内容

创建具有默认值的数组时,* 我注意到了一些怪异( 和危险的恕我直言 )行为。如Swift
2.1中所述:集合类型


*

Swift的Array类型还提供了一个初始化程序,用于创建一个特定大小的数组,并将其所有值设置为相同的默认值。您向此初始值设定项传递要添加到新数组中的项目数(称为count)和适当类型的默认值(称为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为每个数组索引创建一个实例。

如果经常需要,则可以定义一个带有“ autoclosure”参数的数组初始化方法:

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() }
    }
}


 类似资料:
  • 问题内容: 仅在将我的PHP环境升级到PHP 5.4及更高版本后,我才看到此错误。错误指向以下代码行: 错误: 从空值创建默认对象 码: 我首先需要声明我的对象吗? 问题答案: 您的新环境可能已为<= 5.3.x的PHP版本启用了警告,或者仅在至少=> 5.4的PHP版本中设置了警告。当触发了错误的或者尚未初始化: 如果已经初始化为某个值但不是对象,则PHP将报告不同的错误消息: 为了符合PHP

  • 问题内容: 如何创建以下注释的实例(所有字段均设置为其默认值)。 我试过了,但这似乎不起作用… 问题答案: 您无法创建实例,但至少要获取默认值 然后,可以使用动态代理返回默认值。据我所知,这也是Java本身处理批注的方式。

  • 在hibernate的xml方法中,创建hibernate SessionFactory对象时使用

  • 使用saveOrUpdate创建新的ebject时,hibernate将对象存储在数据库中并正确返回。但在方法的同一调用中创建了一个带有一些空列的附加对象。 数据库中的对象如下所示: 这是数据类: 这是我将对象存储到数据库的方式:public class DataUtils{private Session Session;private static DataUtils DataUtils; 和我

  • 对不起,如果这是一个微不足道的问题,我是新的指南。假设我有下面这个类: 然后在其他地方我想做: 我希望有两个“MyClass”实例,一个名为“foo ”,一个名为“bar ”(也就是说,它们中的每一个都有一个不同的依赖实例)。我如何将这两个实例添加到我的注入器中,如何用“injector.getInstance”检索它们中的每一个? 我不想为每个可能的依赖项创建一个“MyClass”的子类。 谢谢

  • 我有一个Card类,它包含两个构造函数,你可以在下面的代码中看到。问题是,每个卡片对象包含2个字符串和2个图像,因为我想保存这些对象,所以我必须将图像的路径保存为字符串,然后检索它们,因此需要2个构造函数。然而,使用一些打印语句,我发现每当检索到一张卡片时,就会创建两个独立的对象:一个正常的对象和另一个空的对象。我知道这是因为我在第二张卡中使用第一个构造器创建了一张新卡。有没有办法避免这样的情况,