gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 12:29:50 25 4
gpt4 key购买 nike

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

我正在按照 Swift TDD 书中的教程了解 Swift 中的 OOP 架构。本教程基于创建待办事项列表应用程序。在本书的开头,我们创建了一个类似于每个待办事项的结构。接下来,我们创建了一个名为 ItemManger 的类来管理保存待办事项的数组和另一个保存已勾选待办事项的数组。我可以理解从结构中创建项目的想法,因为它是一种值类型,每次实例化时都会创建一个新实例,而 itemManager 是从一个类中创建的,因为我们只需要一个 itemManger 来跟踪要执行的项目。我提出的问题是,当我们在另一个类或 View Controller 中创建 ItemManager 类型(它是一个类)的实例时,这是否会引用我们之前创建的同一个类,我们将能够在其中访问待办事项数组?

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

这是 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()
}

}

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

import UIKit

enum Section: Int {
case toDo
case done
}

class ItemListDataProvider: NSObject, UITableViewDataSource, UITableViewDelegate {

var itemManager: ItemManager?


func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {


guard let itemManager = itemManager else{return 0}

guard let itemSection = Section(rawValue: section)else{ fatalError() }

let numberOfRows: Int

switch itemSection {
case .toDo:
numberOfRows = itemManager.toDoCount
case .done:
numberOfRows = itemManager.doneCount
}

return numberOfRows
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

let cell = tableView.dequeueReusableCell(withIdentifier: "ItemCell", for: indexPath) as! ItemCell

guard let itemManager = itemManager else { fatalError() }

guard let section = Section(rawValue: indexPath.section) else { fatalError() }

let item: ToDoItem

switch section {
case .toDo:
item = itemManager.item(at: indexPath.row)
case .done:
item = itemManager.doneItem(at: indexPath.row)
}

cell.configCell(with: item)

return cell
}

func numberOfSections(in tableView: UITableView) -> Int {
return 2
}
}

最佳答案

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

Here is another class where we create an instance variable of the ItemManager type:

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

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

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

will this refer to the same class we created before in which we'll be able to access the to do item arrays?

真的无法回答。您在哪里创建了 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 的实例,并且不能访问相同的项目。

关于ios - 更好地理解 Swift 中的引用类型与值类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42308080/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com