我正在从一个待办事项列表中编写一个应用程序但是我对它为什么这样设置并且可以使用其他视角感到有些困惑。
如果我追加到函数中的全局数组,为什么还要从函数返回一个项?为什么我们不只是查询该项目的数组。我没有理解为什么要退回这个项目或者如何使用它。
import Foundation
import UIKit
class ItemStore {
var allItems = [Item]()
func createItem() -> Item {
//use a constant to initialize a new item using the Item class's syntax
let newItem = Item.init(random: true)
//now append it to this class's allItems array
allItems.append(newItem)
//now according to this function we need to return an Item object. Now return newItem....but why are we returning it if we just appended it to the allItems array?? Can't we just query the array for this item? I wonder how this returned item is going to be used now
return newItem
}
//now I'm going to add a designated initializer to this class which will add five random items to the allItems array....arrgghh, whhyyy??
init() {
for _ in 0..<5 {
createItem()
}
}
}
答案 0 :(得分:2)
您的createItem
功能不应该附加任何内容。它应该只是说 - 创建并返回一个新项目。让调用者确定如何处理新项目。我会将您的代码重构为:
class ItemStore {
var allItems = [Item]()
func createItem() -> Item {
let newItem = Item(random: true)
return newItem
}
init() {
for _ in 0..<5 {
let item = createItem()
allItems.append(item)
}
}
}
或者你可以重构为:
class ItemStore {
var allItems = [Item]()
func loadItems() {
for _ in 0..<5 {
let item = Item(random: true)
allItems.append(item)
}
}
init() {
loadItems()
}
}
最好避免非明显的副作用。名为createItem
的方法也会将新创建的项目添加到某个列表中并不明显。保持方法集中。将功能放在它所属的位置。
答案 1 :(得分:1)
一个原因是能够在班级中设置其他属性。
假设该类具有index
属性,并且您想要分配连续索引。
init() {
for i in 0..<5 {
let newItem = createItem()
newItem.index = i
}
}
答案 2 :(得分:1)
我不认为这是一种错误的方法,开发人员可能希望像这样直接使用添加的项目
let store = ItemStore()
let item = store.createItem()
这可能会与编写init
方法的方式混淆,因为他可能希望函数执行多项操作