2017-03-05 62 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類中使用這些屬性來設置表格視圖單元格的外觀。