0

は、次のコードを参照してください:paramsが異なるプロパティを持つ異なる構造体である関数を一般化する方法は?

import UIKit 

struct Item { 
    var brandId = 1 
    var name: String = "" 
} 
struct Store { 
    var areaName = "" 
    var name: String = "" 
} 

let itemArray = [Item(brandId: 1, name: "item1"), Item(brandId: 2, name: "item2"), Item(brandId: 1, name: "item3") ] 

let storeArray = [Store(areaName: "hk", name: "store1"), Store(areaName: "bj", name: "store2"), Store(areaName: "hk", name: "store3")] 


var intKeys = [Int]() 
var groupedItems = [[Item]]() 

var stringKeys = [String]() 
var groupedStores = [[Store]]() 

extension Array { 

    func transTo2d() -> [[Element]] { 
     let grouped = [[Element]]() 

     return grouped 
    } 

} 

itemArray.forEach { (item) in 
    let brandId = item.brandId 
    if !intKeys.contains(brandId) { 
     intKeys.append(brandId) 
     var newArray = [Item]() 
     newArray.append(item) 
     groupedItems.append(newArray) 
    } else { 
     let index = intKeys.index(of: brandId)! 
     groupedItems[index].append(item) 
    } 
} 

私の最終目標は、ストアのareaNameに基づいて2次元配列を取得storeArray.transTo2d()を使用して、アイテムのbrandIdに基づいて2次元配列を取得itemArray.transTo2d()を使用して可能性があります。私はキーに基づいて2次元配列にtrans 1d配列を汎用化する方法はありませんか?

+1

は、作成される各ストアにアイテムのリストを持たせることですか?もしそうなら、 'struct Store {var areaName =" "var name:String =" "var items:[Item] = []}'を実行するだけではどうですか?あなたがもっと詳しく説明できない場合 – Lamar

+0

'Item'と' Store'の関係は何ですか?また、私が知る限り、Swiftに2D配列を作成するネイティブな方法はありません。あなたが使用しているのは、配列の配列であり、2D配列ではありません。 – ebby94

+0

いいえ、 '' 'Store'''、' 'Items'''は関係がありません。 '' 'struct''のちょうど2つの例は、' '' 'Int''型で、キーは' 'String'''です。私はstoresArray、itemsArrayを持っていて、自分のキーに基づいて2次元配列に変換したいのですが、同じ変換ロジックを共有します@Lamar –

答えて

0

一般的な一般的な方法を書くためにどちらの関係も共有していないので、要素のタイプがItemまたはStoreのArrayの汎用拡張を書くことはできません。要素が上記のタイプになる場合は、Arrayの拡張を記述できます。両方の構造体を同等のプロトコルに適合させるだけです。

これは、私はあなたが望んでいたと考えているものです。この出力を印刷する関数を変換

let storeArray = [Store(areaName: "hk", name: "store1"), Store(areaName: "bj", name: "store2"), Store(areaName: "hk", name: "store3")] 
let itemArray = [Item(brandId: 1, name: "item1"), Item(brandId: 2, name: "item2"), Item(brandId: 1, name: "item3") ] 
print(storeArray.transform()) 
print(itemArray.transform()) 

を使用して

struct Item { 
    var brandId = 1 
    var name: String = "" 
} 

extension Item : Equatable{ 
    static func ==(lhs: Item, rhs: Item) -> Bool{ 
     return lhs.brandId == rhs.brandId 
    } 
} 

struct Store { 
    var areaName = "" 
    var name: String = "" 
} 

extension Store : Equatable{ 
    static func ==(lhs: Store, rhs: Store) -> Bool{ 
     return lhs.areaName == rhs.areaName 
    } 
} 

extension Array where Element == Store{ 
    func transform()->[[Store]]{ 
     var storeArray = self 
     var groupedArray = [[Store]]() 
     while storeArray.count > 0{ 
      if let firstElement = storeArray.first{ 
       groupedArray.append(storeArray.filter{$0.areaName == firstElement.areaName}) 
       storeArray = storeArray.filter{$0.areaName != firstElement.areaName} 
      } 
     } 
     return groupedArray 
    } 
} 

extension Array where Element == Item{ 
    func transform()->[[Item]]{ 
     var itemArray = self 
     var groupedArray = [[Item]]() 
     while itemArray.count > 0{ 
      if let firstElement = itemArray.first{ 
       groupedArray.append(itemArray.filter{$0.brandId == firstElement.brandId}) 
       itemArray = itemArray.filter{$0.brandId != firstElement.brandId} 
      } 
     } 
     return groupedArray 
    } 
} 

[[Store(areaName: "hk", name: "store1"), Store(areaName: "hk", name: "store3")], [Store(areaName: "bj", name: "store2")]] 
[[Item(brandId: 1, name: "item1"), Item(brandId: 1, name: "item3")], [Item(brandId: 2, name: "item2")]] 
関連する問題