Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.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 为什么数组(repeating:Dog(),count:7)生成一个由7个元素组成的数组,这些元素指向同一个Dog实例?_Arrays_Swift - Fatal编程技术网

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