更好地理解Swift中的引用与值类型

时间:2017-02-17 21:56:43

标签: ios swift oop

在阅读了Swift文档和各种在线教程之后,我仍然有点难以理解引用类型与值类型。

我正在阅读Swift TDD手册中的教程,以了解Swift中的OOP架构。本教程基于创建待办事项列表应用程序。在本书的开头,我们创建了一个类似于每个项目的结构。接下来,我们创建了一个名为ItemManger的类来管理保存以执行项目的数组,并创建另一个数组来保持已关闭以执行项目。我可以理解从结构中创建项目的想法,因为它是一个值类型,每次实例化时都会创建一个新实例,而itemManager是由类创建的,因为我们只需要一个itemManger来跟踪要执行的项目。我提出的问题是当我们在另一个类或视图控制器中创建一个ItemManager类型(它是一个类)的实例时,它会引用我们之前创建的同一个类,我们在其中能够访问待办事项数组吗?

在本书出版之前,我假设为了跟踪类中的变量,我们必须将它们标记为静态。

这是itemManager类:

df = df.set_index('Season', append=True)
print (df)
               Points
Teams  Season        
Team A 1            5
Team B 1            6
Team C 1            4
Team D 1            5
Team A 2            7
Team B 2            8
Team C 2            3
Team D 2            2

print (df.loc[('Team A',1)])
Points    5
Name: (Team A, 1), dtype: int64

这是另一个我们创建ItemManager类型的实例变量的类:

import Foundation

class ItemManager {

    var toDoCount: Int {return toDoItems.count }

    var doneCount: Int {return doneItems.count }

    private var toDoItems: [ToDoItem] = []

    private var doneItems: [ToDoItem] = []


    func add(item: ToDoItem) {

        if !toDoItems.contains(item){
            toDoItems.append(item)
        }

    }

    func checkItem(at index: Int) {
        let item = toDoItems.remove(at: index)
        doneItems.append(item)
    }

    func doneItem(at index: Int) -> ToDoItem{
        return doneItems[index]
    }

    func item(at index: Int) -> ToDoItem{
        return toDoItems[index]
    }

    func removeAll(){

        toDoItems.removeAll()
        doneItems.removeAll()
    }

}

1 个答案:

答案 0 :(得分:2)

在您发布的代码中,您创建ItemManager的实例。

  

这是另一个我们创建ItemManager类型的实例变量的类:

ItemListDataProvider 可以 ItemManager,但不会创建一个。创建类的实例通过调用它的构造函数来实现:

// Creates an instance of ItemManager and assigns it to itemManager
let itemManager = ItemManager()  

因为您没有显示项目管理器的创建位置,所以问题

  

这会引用我们之前创建的同一个类,我们将能够访问待办事项数组吗?

无法真正回答。你在哪里创建了ItemManager的实例以及你用它做了什么?

以下是一个例子:

let itemManagerA = ItemManager()

let itemListDataProviderA() = ItemListDataProvider()
itemListDataProviderA.itemManager = itemManagerA

let itemListDataProviderB() = ItemListDataProvider()
itemListDataProviderB.itemManager = itemManagerA

在此示例中 ItemListProvider相同 ItemManager,因此可以访问相同的项目数组。

相反,如果你这样做:

let itemManagerA = ItemManager()
let itemListDataProviderA() = ItemListDataProvider()
itemListDataProviderA.itemManager = itemManagerA

let itemManagerB = ItemManager() // <-- This creates a SECOND instance of ItemManager
let itemListDataProviderB() = ItemListDataProvider()
itemListDataProviderB.itemManager = itemManagerB // <-- We use the SECOND instance instead of the first one for itemListDataProviderB

ItemListProviderItemListProvider不同个实例,可以访问相同的项目。