在阅读了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()
}
}
答案 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
ItemListProvider
个ItemListProvider
的不同个实例,不可以访问相同的项目。