如何将未知结构传递给函数 - swift 3,IOS10

时间:2017-03-05 20:44:03

标签: function data-structures swift3 ios10

这将是我关于StackOverflow的第一个问题,也是我在Swift 3上提出的第一个问题;我是初学者,也许咬得比我能咀嚼的多,但是......

我正在尝试创建一个类,它将帮助创建菜单项(该类称为'MenuItems')以填充到我的IOS应用程序中的动态表中。我创建了大量的类,它从传递给它的数据中识别标题是什么以及每种类型中有多少将被分成表中的部分。我现在正处于尝试使类更通用的阶段,因此它将适用于我可能希望将来填充到类似表中的不同数据结构。

我希望在表中提供的数据来自一个自己的swift文件中的结构。它看起来像这样:

struct EquipmentStruct {
    var name : String!
    var serialNumber : String?
    var alias : String?
    var image : UIImage?
}

我有一个类型为EquipmentStruct的数组,从短期来看,它是在我的tableViewController文件中初始化的(将来不会留在这里)我希望在我的MenuItems类中创建一个公共函数,这将允许我根据需要在表格中添加项目

func addItem(item, dataType) // types for item and dataType are part of my question

在设计此功能时,我发现了我的问题:

  1. 如何将一个类型为EquipmentStruct的变量传递给我的MenuItems类的实例,这样我就可以将它添加到我的表中 - 请注意,我所要求的只是指导如何完成addItem方法而不是班上的其他人。在我看来,我想做一些像:

    var dataArray : [EquipmentStruct] =
    [EquipmentStruct(name: "SA80",  serialNumber:"01234-56-789", alias: "29", image: #imageLiteral(resourceName: "SA80")),
     EquipmentStruct(name: "LSW",  serialNumber:"11111-22-333-4444", alias: "98", image: #imageLiteral(resourceName: "LSW"))]
    
    var tableMenuItems = MenuItems() // create instance of class MenuItems
    
    override func viewDidLoad() {
    
    super.viewDidLoad()        
    
    for var itemNumber in 0..<dataArray.count{
        tableMenuItems.addItem(item: generalHoldingsDataArray[itemNumber], dataType: EquipmentStruct)
    }
    
  2. addItems方法原型因此类似于:

    // Add new item of type 'dataType' to MenuItems.tableDataArray
    // Store tableDataArrayType for use throughout the class
    //
    func addItem(item: [Something], dataType: SomeVariableType){
        if let newItem = item as! dataType{ // cast the variable received to its type
            tableDataArrayType = dataType
            tableDataArray.append(newItem)
        }
    }
    
    1. 这是一种很好的做事方式吗?

    2. 有没有更简单的方法来做我想做的事情?

    3. 如果我继续沿着这条道路前进,未来我可能遇到哪些问题?

    4. 非常感谢您的协助。

      亲切的问候

1 个答案:

答案 0 :(得分:0)

表视图应该只包含一种类型的东西作为模型。单个表格视图并非旨在显示有关EquipmentStructSomeOtherStruct和3 Foo的信息。您必须将所有这些概括为一种类型。

另一种可能性是您要创建一个MenuItems类型,可以创建一个显示EquipmentStruct的表视图,一个显示SomeOtherStruct的表视图,基本上是一个表视图显示你喜欢的任何类型。如果是这种情况,您应该使用 generics

像这样制作MenuItems类:

class MenuItems<T : SomeProtocol> {
    var tableDataArray: [T] = []

    func addItem(_ newItem: T) {
        tableDataArray.append(newItem)
    }
    // ...
    // since you just need guidance on creating addItems method, figure the rest yourself please! XD
}

创建一个显示EquipmentStruct s,

的表格视图
let tableMenuItems = MenuItems<EquipmentStruct>()

创建一个显示SomeOtherStruct s,

的表格视图
let tableMenuItems = MenuItems<SomeOtherStruct>()

注意第一行中的SomeProtocol?这定义了类型应具有的属性/方法,以便在表视图中显示。可能的SomeProtocol可能是:

protocol SomeProtocol {
    var displayTitle: String { get }
    var displaySubtitle: String? { get }
    var displayImage: UIImage? { get }
}

这只是确保您要在表视图中显示的类型具有名为displayTitledisplaySubtitledisplayImage的属性。您可以在MenuItems类中使用这些属性来设置表格视图单元格&#39; appearences。