假设Dog
是一个类
let arr = Array(repeating: Dog(), count: 7)
为什么数组中的所有元素都指向同一个狗实例?现在,我知道如何运行一个普通的for循环,并创建7个实例,如
var arr = [Dog]()
for i in 1...7 {
arr[i] = Dog()
}
但这不是重点。我想从更深层次上理解init(repeating:count:)
函数。请分享你的见解!
发布于 2020-02-18 10:55:55
它按照文档的方式工作-重复单值。在您的示例中,值是指向类Dog
的一旦创建的实例的指针。
/创建一个新集合,其中包含指定数量的单个值/重复值。/这里是一个创建包含字母*Z*的字符串/初始化的数组的示例。/让5veZs=Array(重复:"Z",计数: 5) /打印(5)/打印"Z",“Z”/-参数:/- repeatedValue:要重复的元素。/- count:重复/
repeating
参数中传递的值的次数。count
必须为零或更大。@inlinable public init(重复repeatedValue: Element,count: Int)
发布于 2020-02-18 11:03:56
它没有什么特别之处,只是类类型值的复制方式。通过复制指向相同对象的引用来复制类的实例。通过复制整个实例来复制结构的实例。
要实现您想要做的事情,您需要为数组中的每个位置创建一个单独的实例。您可以使用为map
提供的闭包来做到这一点。
(1...7).map { _ in Dog() }
发布于 2020-02-18 11:06:48
如果Dog是一个结构,那么这两个实例实际上是不同的:
struct Dog {
var hungry = true
}
var arr = Array(repeating: Dog(), count: 2) // two hungry dogs
print(arr[0].hungry) // true
print(arr[1].hungry) // true
arr[1].hungry = false // feed second dog
print(arr[0].hungry) // true
print(arr[1].hungry) // false
否则,如果Dog是类-两个实例是相同的(都引用同一个对象):
class Dog {
var hungry = true
}
var arr = Array(repeating: Dog(), count: 2) // two hungry dogs
print(arr[0].hungry) // true
print(arr[1].hungry) // true
arr[1].hungry = false // feed second dog
print(arr[0].hungry) // false
print(arr[1].hungry) // false
https://stackoverflow.com/questions/60287635
复制相似问题