2017-03-05 39 views
0

这将是我在StackOverflow上的第一个问题,也是我在Swift 3上提出的第一个问题;我是一个初学者,也许咬比我可以咀嚼,但是...如何将未知的结构传递给函数 - swift 3,IOS10

我想创建一个类,这将有助于创建菜单项(类称为'MenuItems')填充到一个我的IOS应用程序中的动态表。我已经创建了这个类的大部分,它根据传递给它的数据来标识头是什么以及每种类型的多少将在表中分成几个部分。我现在正在试图让这个类变得更通用,所以它可以用于不同的数据结构,我可能会在将来将它们填充到类似的表中。

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

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

我有,在短期内,在我tableViewController文件(它不会呆在这里将来)初始化类型EquipmentStruct的数组,我希望创造一个公共职能在我的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:"-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) 
    } 
    

的为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) 
    } 
} 

  • 这是做事的好方法吗?

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

  • 如果我继续沿着这条道路走下去,可能会遇到什么问题?

  • 您的帮助将不胜感激。

    亲切的问候

    +0

    表格视图应该只包含一种类型的东西。你是否试图创建一个表格视图来保存许多不同类型的对象作为模型?或者你是否试图创建多个表视图,每个表视图都将一种类型的对象保存为模型,但具有相同的'MenuItems'类? – Sweeper

    回答

    0

    表视图应该只保留一种类型的东西作为模型。单个表格视图并不旨在显示有关EquipmentStructSomeOtherStruct和可能3 Foo s的信息。你必须将所有这些概括为一种类型。

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

    充分利用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个表视图,

    let tableMenuItems = MenuItems<EquipmentStruct>() 
    

    要创建显示SomeOtherStruct个表视图,

    let tableMenuItems = MenuItems<SomeOtherStruct>() 
    

    请注意杉木中的SomeProtocol st line?它定义了类型应该具有的属性/方法,以便在表格视图中显示。一个可能的SomeProtocol可能是:

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

    这只是确保您要在表格视图中显示的类型有属性称为displayTitledisplaySubtitledisplayImage。您可以在您的MenuItems类中使用这些属性来设置表格视图单元格的外观。