Arrays 为什么数组(repeating:Dog(),count:7)生成一个由7个元素组成的数组,这些元素指向同一个Dog实例?
假设狗是一个类Arrays 为什么数组(repeating:Dog(),count:7)生成一个由7个元素组成的数组,这些元素指向同一个Dog实例?,arrays,swift,Arrays,Swift,假设狗是一个类 let arr = Array(repeating: Dog(), count: 7) 为什么数组中的所有元素都指向同一个dog实例? 现在,我知道运行一个普通for循环并创建7个实例,如 var arr = [Dog]() for i in 1...7 { arr[i] = Dog() } 但这不是重点。我想更深入地理解initrepeating:count:function。请分享您的见解 它的工作方式与文档中的一样-重复单个值。在您的例子中,一个值是指向一次创建
let arr = Array(repeating: Dog(), count: 7)
为什么数组中的所有元素都指向同一个dog实例?
现在,我知道运行一个普通for循环并创建7个实例,如
var arr = [Dog]()
for i in 1...7 {
arr[i] = Dog()
}
但这不是重点。我想更深入地理解initrepeating:count:function。请分享您的见解 它的工作方式与文档中的一样-重复单个值。在您的例子中,一个值是指向一次创建的类Dog实例的指针
这没什么特别的,只是类类型的值是如何被复制的。通过复制指向相同对象的引用来复制类的实例。通过复制整个实例来复制结构实例 要实现所需操作,需要为阵列中的每个位置创建单独的实例。您可以使用为映射提供的闭包来实现这一点:
如果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
这取决于Dog是结构还是类。对于一个结构,你会得到多个实例。@vadian我认为最好考虑一下,并用副本来解释它。通过复制指向相同对象的引用来复制类的实例。通过复制整个实例来复制结构的实例。您还可以添加到源的链接吗?@Alexander,哪个源?数组接口声明?它是标准的Swift采集模块。或者我误解了什么?哦,我以为你引用了github回购协议中的话。我现在看到它是一个生成的接口,因为没有打开{
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
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