创建一个类的所有对象的数组

时间:2017-08-05 22:54:12

标签: arrays swift class tableview

有没有办法创建所有颜色对象的数组?因此,每次添加新颜色时,它也会自动添加到数组中?

class Colours {
    var colourName: String
    var colourShades: [String?]


    init(colourName: String, colourShades: [String?]) {
        self.colourName = colourName
        self.colourShades = colourShades
    }


}

var red = Colours(colourName: "Red", colourShades: ["Crimson", "Cherry", "Rose"])


var blue = Colours(colourName: "blue", colourShades:["Ice", "Baby", "Royal"])

为了给出一些背景信息,我正在尝试为IOS开发一个包含颜色表的应用程序。然后当用户点击颜色时,它会将它们带到另一个具有该颜色阴影的表中。

我想要颜色数组,以便我可以自动填充表格的行,然后当用户添加新颜色时,它会自动添加新行。

4 个答案:

答案 0 :(得分:3)

使用Colours中定义的静态数组来保存已创建的所有颜色。您可以从应用中的任何位置以Colours.allColours的形式访问此数组。

创建一个名为ColourWatcher的协议,并在static上创建delegate Colours,以便在添加颜色时收到通知。

让你的tableView实现ColourWatcher并将自己添加为delegate。然后,当添加颜色时,将在newColourAdded中调用方法TableViewController,您可以重新加载数据。

另外,我建议将颜色阴影数组设为[String]而不是使用选项。空数组将表示您没有阴影。

protocol ColourWatcher: class {
    func newColourAdded(colour: Colour)
}

class Colours {
    static var allColours: [Colours] = []
    static weak var delegate: ColourWatcher?

    var colourName: String
    var colourShades: [String]

    init(colourName: String, colourShades: [String]) {
        self.colourName = colourName
        self.colourShades = colourShades
        Colours.allColours.append(self)
        Colours.delegate?.newColourAdded(colour: self)
    }
}

class MyTableViewController: UIViewController, ColourWatcher {

    func viewDidLoad() {
        super.viewDidLoad()
        Colours.delegate = self
    }

    func newColourAdded(colour: Colour) {
        // reload table view or just insert a new row
        // using the passed in colour
    }
}

答案 1 :(得分:1)

  

有没有办法创建所有颜色对象的数组?所以   每次添加新颜色时,它也会自动添加   到阵列?

你可以在你的类中声明一个数组并像这样追加

lazy var colorList = {
  Colours()
}()
  

我想要颜色数组,以便我可以自动填写   表的行,然后当用户添加新颜色时   自动添加新行。

func addColor() {
   colorList.append(Colours(colourName: "Red", colourShades: 
   ["Crimson", "Cherry", "Rose"]))
   colorList.append(Colours(colourName: "blue", colourShades:["Ice", 
   "Baby", "Royal"]))
}

在添加颜色后调用上述方法,然后刷新表格以在表格行上显示新的颜色信息。

  

为了给出一些上下文,我正在尝试为IOS开发一个应用程序   包括一张颜色表。然后当用户点击它的颜色时   将他们带到另一张有这种颜色的桌子。

现在,在您的tableView cellForrowatindexpath方法中,您只需访问上述colorlist数组并获取colorname并显示在您的表格上。

当用户点击单元格时,然后在didSelecteRowAtIndexpath方法内加载另一个类并将上面的colorList数组信息传递给该类,并为了显示颜色访问权限{{来自colourShades数组的信息。

答案 2 :(得分:1)

在我看来,你想在整个应用程序中保留一个状态。

解决问题的最佳方法是创建Singleton实例。

E.g。

class ColoursSharedModel {

    static let shared : ColoursSharedModel = ColoursSharedModel()

    var choosenColors : [Colors] = []
    private init() {}
}

稍后,您应该添加

ColoursSharedModel.shared.choosenColors.append(self)

在你的颜色'初始化。

答案 3 :(得分:1)

1)添加您自己的通知名称

extension NSNotification.Name {

    // 1
    static let NewColourAdded = NSNotification.Name(rawValue: "NewColourAdded")
}

2)将对象池的访问修饰符(静态变量all)设置为private(set)

3)将初始化的颜色添加到对象池

4)发布通知

class Colours {

    // 2
    private(set) static var all: [Colours] = []

    var name: String
    var shades: [String]

    init(name: String, shades: [String]) {
        self.name = name
        self.shades = shades

        // 3
        Colours.all.append(self)

        // 4
        NotificationCenter.default.post(
            name: .NewColourAdded, 
            object: self
        )
    }
}

使用

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        NotificationCenter.default.addObserver(
            self, 
            selector: #selector(self.onNewColourAdded), 
            name: .NewColourAdded, 
            object: nil
        )
    }

    func onNewColourAdded(notification: Notification) {
        guard let newColours = notification.object as? Colours else { 
            return 
        }

        // Do something
    }
}